{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.5.0+27.g2d457b0.dirty\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import folium\n",
    "\n",
    "print(folium.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2dpdC5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIiAvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfZjcyNWFkZWVlYmE5NDM4NWIyNjVjYzAwNTU3OWMyNjMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4xLjAvTWFya2VyQ2x1c3Rlci5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9NYXJrZXJDbHVzdGVyLkRlZmF1bHQuY3NzIiAvPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2Y3MjVhZGVlZWJhOTQzODViMjY1Y2MwMDU1NzljMjYzIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9mNzI1YWRlZWViYTk0Mzg1YjI2NWNjMDA1NTc5YzI2MyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9mNzI1YWRlZWViYTk0Mzg1YjI2NWNjMDA1NTc5YzI2MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDQsLTczXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2E1OTQzMmVmNzA4YzQ5OWU5YTAzMDRkZGUyMzZmNDYzID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3MjVhZGVlZWJhOTQzODViMjY1Y2MwMDU1NzljMjYzKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NsdXN0ZXJfMDliMTI3ODRhNTgyNDY2NGJiNmM3ODE2NWRmZjg4ZjEgPSBMLm1hcmtlckNsdXN0ZXJHcm91cCh7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG1hcF9mNzI1YWRlZWViYTk0Mzg1YjI2NWNjMDA1NTc5YzI2My5hZGRMYXllcihtYXJrZXJfY2x1c3Rlcl8wOWIxMjc4NGE1ODI0NjY0YmI2Yzc4MTY1ZGZmODhmMSk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzA1ZDIyZmYxOWU4ZDRmNTlhZWQ2ZDc1NzYyYzBhM2MxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjcsIC03My45NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wOWIxMjc4NGE1ODI0NjY0YmI2Yzc4MTY1ZGZmODhmMSk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMzY4YjY0YWMxN2IyNDgxZTk2ODFlNjk5NzIyNmNkMDUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdvay1zaWduJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8wNWQyMmZmMTllOGQ0ZjU5YWVkNmQ3NTc2MmMwYTNjMS5zZXRJY29uKGljb25fMzY4YjY0YWMxN2IyNDgxZTk2ODFlNjk5NzIyNmNkMDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWY3ZmU5YTg3OTc3NGYxNzk3M2VmZjVmNTQwY2U5Y2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTk3ZTJjZWUwNWRjNDdhYzllNGZkNzljODM1NzZlN2UgPSAkKCc8ZGl2IGlkPSJodG1sX2E5N2UyY2VlMDVkYzQ3YWM5ZTRmZDc5YzgzNTc2ZTdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BZGQgcG9wdXAgdGV4dCBoZXJlLjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWY3ZmU5YTg3OTc3NGYxNzk3M2VmZjVmNTQwY2U5Y2Iuc2V0Q29udGVudChodG1sX2E5N2UyY2VlMDVkYzQ3YWM5ZTRmZDc5YzgzNTc2ZTdlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDVkMjJmZjE5ZThkNGY1OWFlZDZkNzU3NjJjMGEzYzEuYmluZFBvcHVwKHBvcHVwXzVmN2ZlOWE4Nzk3NzRmMTc5NzNlZmY1ZjU0MGNlOWNiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2M2MDcxOTE1YzcxZDQyMzg4NTg1N2JmYjBlMTc4YzdhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDQuNjcsIC03My45NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wOWIxMjc4NGE1ODI0NjY0YmI2Yzc4MTY1ZGZmODhmMSk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYjgwMTFmZDA0Mzc2NDE0MTljMDdiZDE0NzU0ZGI3MmYgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdyZW1vdmUtc2lnbicsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2M2MDcxOTE1YzcxZDQyMzg4NTg1N2JmYjBlMTc4YzdhLnNldEljb24oaWNvbl9iODAxMWZkMDQzNzY0MTQxOWMwN2JkMTQ3NTRkYjcyZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNzI4NDg0MmRlOGY0OWEzOWJhNzllZWFhNzAxZmEwZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xOTQ0YzNlZDNkNWU0YTU1YTc5ZGYyMTM3ZWZjNDcwNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMTk0NGMzZWQzZDVlNGE1NWE3OWRmMjEzN2VmYzQ3MDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFkZCBwb3B1cCB0ZXh0IGhlcmUuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNzI4NDg0MmRlOGY0OWEzOWJhNzllZWFhNzAxZmEwZC5zZXRDb250ZW50KGh0bWxfMTk0NGMzZWQzZDVlNGE1NWE3OWRmMjEzN2VmYzQ3MDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jNjA3MTkxNWM3MWQ0MjM4ODU4NTdiZmIwZTE3OGM3YS5iaW5kUG9wdXAocG9wdXBfMzcyODQ4NDJkZThmNDlhMzliYTc5ZWVhYTcwMWZhMGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjMwNDFhYmEzNTUzNDE4ZmE3MzUzYzA5ZTI0ZDIzNmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0NC42NywgLTcxLjk0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzA5YjEyNzg0YTU4MjQ2NjRiYjZjNzgxNjVkZmY4OGYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U1MGM5ZThkZDRmYzQ3YWZhZWU5YjI5OTQxNzc4MDQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA5ODFlMjc0OTg5ODQyZDdiZTc3M2E3ZDY5NzFhYjYzID0gJCgnPGRpdiBpZD0iaHRtbF8wOTgxZTI3NDk4OTg0MmQ3YmU3NzNhN2Q2OTcxYWI2MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWRkIHBvcHVwIHRleHQgaGVyZS48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U1MGM5ZThkZDRmYzQ3YWZhZWU5YjI5OTQxNzc4MDQ5LnNldENvbnRlbnQoaHRtbF8wOTgxZTI3NDk4OTg0MmQ3YmU3NzNhN2Q2OTcxYWI2Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzIzMDQxYWJhMzU1MzQxOGZhNzM1M2MwOWUyNGQyMzZmLmJpbmRQb3B1cChwb3B1cF9lNTBjOWU4ZGQ0ZmM0N2FmYWVlOWIyOTk0MTc3ODA0OSk7CgogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7fb3192b9780>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from folium.plugins import MarkerCluster\n",
    "\n",
    "\n",
    "m = folium.Map(location=[44, -73], zoom_start=5)\n",
    "\n",
    "marker_cluster = MarkerCluster().add_to(m)\n",
    "\n",
    "\n",
    "folium.Marker(\n",
    "    location=[40.67, -73.94],\n",
    "    popup='Add popup text here.',\n",
    "    icon=folium.Icon(color='green', icon='ok-sign'),\n",
    ").add_to(marker_cluster)\n",
    "\n",
    "folium.Marker(\n",
    "    location=[44.67, -73.94],\n",
    "    popup='Add popup text here.',\n",
    "    icon=folium.Icon(color='red', icon='remove-sign'),\n",
    ").add_to(marker_cluster)\n",
    "\n",
    "folium.Marker(\n",
    "    location=[44.67, -71.94],\n",
    "    popup='Add popup text here.',\n",
    "    icon=None,\n",
    ").add_to(marker_cluster)\n",
    "\n",
    "m.save(os.path.join('results', '1000_MarkerCluster0.html'))\n",
    "\n",
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "size = 100\n",
    "lons = np.random.randint(-180, 180, size=size)\n",
    "lats = np.random.randint(-90, 90, size=size)\n",
    "\n",
    "locations = list(zip(lats, lons))\n",
    "popups = ['lon:{}<br>lat:{}'.format(lon, lat) for (lat, lon) in locations]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Adding all icons in a single call"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "icon_create_function = \"\"\"\\\n",
    "function(cluster) {\n",
    "    return L.divIcon({\n",
    "    html: '<b>' + cluster.getChildCount() + '</b>',\n",
    "    className: 'marker-cluster marker-cluster-large',\n",
    "    iconSize: new L.Point(20, 20)\n",
    "    });\n",
    "}\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2dpdC5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIiAvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMDQ2OGVjOWQxMGM5NDQxYThmMTA4MWQ1YTdmMDZkODcgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4xLjAvTWFya2VyQ2x1c3Rlci5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9NYXJrZXJDbHVzdGVyLkRlZmF1bHQuY3NzIiAvPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzA0NjhlYzlkMTBjOTQ0MWE4ZjEwODFkNWE3ZjA2ZDg3IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8wNDY4ZWM5ZDEwYzk0NDFhOGYxMDgxZDVhN2YwNmQ4NyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8wNDY4ZWM5ZDEwYzk0NDFhOGYxMDgxZDVhN2YwNmQ4NycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbLTIuMTIsLTguNTVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfOGQzODQ0OGZlZTRmNGMwMDlhMjEzMjNkZTVjYWYzZmIgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL2NhcnRvZGItYmFzZW1hcHMte3N9Lmdsb2JhbC5zc2wuZmFzdGx5Lm5ldC9saWdodF9hbGwve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8wNDY4ZWM5ZDEwYzk0NDFhOGYxMDgxZDVhN2YwNmQ4Nyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlID0gTC5tYXJrZXJDbHVzdGVyR3JvdXAoewogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICBpY29uQ3JlYXRlRnVuY3Rpb246IGZ1bmN0aW9uKGNsdXN0ZXIpIHsKICAgIHJldHVybiBMLmRpdkljb24oewogICAgaHRtbDogJzxiPicgKyBjbHVzdGVyLmdldENoaWxkQ291bnQoKSArICc8L2I+JywKICAgIGNsYXNzTmFtZTogJ21hcmtlci1jbHVzdGVyIG1hcmtlci1jbHVzdGVyLWxhcmdlJywKICAgIGljb25TaXplOiBuZXcgTC5Qb2ludCgyMCwgMjApCiAgICB9KTsKfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBtYXBfMDQ2OGVjOWQxMGM5NDQxYThmMTA4MWQ1YTdmMDZkODcuYWRkTGF5ZXIobWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iZmU3OTQzYTZjNjY0MWQxYmU5ZGNiNThjNGEzZTIxMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xNywgLTg0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwZmM1YmU4ODcwYzQxYjc4MzQ0NWY0YzlhZmQwZWVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQyYjA5YWQ4MjM1YTQyOTdhNDkyNGMxM2YwZDQ4ZDdhID0gJCgnPGRpdiBpZD0iaHRtbF80MmIwOWFkODIzNWE0Mjk3YTQ5MjRjMTNmMGQ0OGQ3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi04NDxicj5sYXQ6LTE3PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMGZjNWJlODg3MGM0MWI3ODM0NDVmNGM5YWZkMGVlZC5zZXRDb250ZW50KGh0bWxfNDJiMDlhZDgyMzVhNDI5N2E0OTI0YzEzZjBkNDhkN2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iZmU3OTQzYTZjNjY0MWQxYmU5ZGNiNThjNGEzZTIxMi5iaW5kUG9wdXAocG9wdXBfMDBmYzViZTg4NzBjNDFiNzgzNDQ1ZjRjOWFmZDBlZWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDZlNzdlZWFhNzA3NDQ4NTk1NjU2MDc1OWRhOTczNmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxMiwgLTE3M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYjFlMmUyMjgzNGM0NTkzODQ1ZDA4ZTQxNTRlNjFmYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZGY1NTBmMjM0MWQ0NDhjOThkYWFmMTNkNDk2YzM3ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNGRmNTUwZjIzNDFkNDQ4Yzk4ZGFhZjEzZDQ5NmMzN2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTczPGJyPmxhdDoxMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWIxZTJlMjI4MzRjNDU5Mzg0NWQwOGU0MTU0ZTYxZmEuc2V0Q29udGVudChodG1sXzRkZjU1MGYyMzQxZDQ0OGM5OGRhYWYxM2Q0OTZjMzdmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDZlNzdlZWFhNzA3NDQ4NTk1NjU2MDc1OWRhOTczNmUuYmluZFBvcHVwKHBvcHVwXzFiMWUyZTIyODM0YzQ1OTM4NDVkMDhlNDE1NGU2MWZhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzk4MTIyNmY3OTE0MzQyNDI4MzMzNDAzZGI3ZjFhNzgyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTQ5LCAzMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMTRhMDhiMzUyZjI0ZDBmOTQ5OTM1MDI3ZGYyODNlNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYWMxOTY3NDdhN2U0YTE0ODE0NTg3NmEyMTAxZjI1MSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmFjMTk2NzQ3YTdlNGExNDgxNDU4NzZhMjEwMWYyNTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjozMTxicj5sYXQ6LTQ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMTRhMDhiMzUyZjI0ZDBmOTQ5OTM1MDI3ZGYyODNlNy5zZXRDb250ZW50KGh0bWxfMmFjMTk2NzQ3YTdlNGExNDgxNDU4NzZhMjEwMWYyNTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85ODEyMjZmNzkxNDM0MjQyODMzMzQwM2RiN2YxYTc4Mi5iaW5kUG9wdXAocG9wdXBfMjE0YTA4YjM1MmYyNGQwZjk0OTkzNTAyN2RmMjgzZTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmQ3NWFlYzYwZGRiNDQzNmFmZWY1OGNiNGI0MzU1OWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMzksIC0zOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYzRkOWViNDZkOWQ0NjlmYjNiYjc1ZDRmYjI4YmQ1ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81Mzc4ZjFmZTYzZDQ0NTE2OWYwYzNiMmE1M2E1NjJiMyA9ICQoJzxkaXYgaWQ9Imh0bWxfNTM3OGYxZmU2M2Q0NDUxNjlmMGMzYjJhNTNhNTYyYjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMzk8YnI+bGF0Oi0zOTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWM0ZDllYjQ2ZDlkNDY5ZmIzYmI3NWQ0ZmIyOGJkNWUuc2V0Q29udGVudChodG1sXzUzNzhmMWZlNjNkNDQ1MTY5ZjBjM2IyYTUzYTU2MmIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYmQ3NWFlYzYwZGRiNDQzNmFmZWY1OGNiNGI0MzU1OWMuYmluZFBvcHVwKHBvcHVwXzFjNGQ5ZWI0NmQ5ZDQ2OWZiM2JiNzVkNGZiMjhiZDVlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2JlZGQyNjIzYzY4MDRhYTZhYzBlMDc4OTkyMTViYWU1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTg0LCA2MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NGQ2OGFlYjExNDI0NjdlYjdmMzZhNTljNDk4YTUyOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNjE5MTUwM2I3Mzc0ZGEwOWQzYmM1OGMwNjYxYmQzMSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjYxOTE1MDNiNzM3NGRhMDlkM2JjNThjMDY2MWJkMzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjo2MTxicj5sYXQ6LTg0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NGQ2OGFlYjExNDI0NjdlYjdmMzZhNTljNDk4YTUyOS5zZXRDb250ZW50KGh0bWxfYjYxOTE1MDNiNzM3NGRhMDlkM2JjNThjMDY2MWJkMzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iZWRkMjYyM2M2ODA0YWE2YWMwZTA3ODk5MjE1YmFlNS5iaW5kUG9wdXAocG9wdXBfODRkNjhhZWIxMTQyNDY3ZWI3ZjM2YTU5YzQ5OGE1MjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjZkNzk5ZGRlMTNiNDkxZmEzZTM4NWNlYjY5NjFhOWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNzUsIC0yM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZmRhZDNiZjU1MmM0YjRlYjFkYjAyNmQxMzI1YTIwMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MjdmMDA1NzI4MmE0MWRjOTcwMDIxNjIzYmNjYzI2ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTI3ZjAwNTcyODJhNDFkYzk3MDAyMTYyM2JjY2MyNmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMjM8YnI+bGF0Oi03NTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmZkYWQzYmY1NTJjNGI0ZWIxZGIwMjZkMTMyNWEyMDAuc2V0Q29udGVudChodG1sXzkyN2YwMDU3MjgyYTQxZGM5NzAwMjE2MjNiY2NjMjZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjZkNzk5ZGRlMTNiNDkxZmEzZTM4NWNlYjY5NjFhOWMuYmluZFBvcHVwKHBvcHVwXzJmZGFkM2JmNTUyYzRiNGViMWRiMDI2ZDEzMjVhMjAwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI0NGNlMWQ5ZWY0YzRkYmQ5MTIyNzVmNWFmNzNiNTdjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTMxLCAtMTMxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkNmRiZDQ4OTBhZTRlNmFiMzNhMzk5NmQxYmQxOWFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M0ZWZhYmQ0ODA4ZDQxM2ZiNGFmZjk0MzQ5YjZhNmQzID0gJCgnPGRpdiBpZD0iaHRtbF9jNGVmYWJkNDgwOGQ0MTNmYjRhZmY5NDM0OWI2YTZkMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xMzE8YnI+bGF0Oi0zMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2Q2ZGJkNDg5MGFlNGU2YWIzM2EzOTk2ZDFiZDE5YWUuc2V0Q29udGVudChodG1sX2M0ZWZhYmQ0ODA4ZDQxM2ZiNGFmZjk0MzQ5YjZhNmQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjQ0Y2UxZDllZjRjNGRiZDkxMjI3NWY1YWY3M2I1N2MuYmluZFBvcHVwKHBvcHVwX2NkNmRiZDQ4OTBhZTRlNmFiMzNhMzk5NmQxYmQxOWFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQyMTdiOGFhYTFmOTQ2MzBhN2U0YTAyODI5YmNkNTM4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTksIC0xMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmU4YjM2MmNiODg1NDc3Yjg2NDRmMzA1YWY1NTIyMzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTFjYWY5NTIwMGUyNGRmMDlkZTJlZGIyNWM5YWE2ZWYgPSAkKCc8ZGl2IGlkPSJodG1sXzExY2FmOTUyMDBlMjRkZjA5ZGUyZWRiMjVjOWFhNmVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTEwMTxicj5sYXQ6LTk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlOGIzNjJjYjg4NTQ3N2I4NjQ0ZjMwNWFmNTUyMjMyLnNldENvbnRlbnQoaHRtbF8xMWNhZjk1MjAwZTI0ZGYwOWRlMmVkYjI1YzlhYTZlZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQyMTdiOGFhYTFmOTQ2MzBhN2U0YTAyODI5YmNkNTM4LmJpbmRQb3B1cChwb3B1cF9iZThiMzYyY2I4ODU0NzdiODY0NGYzMDVhZjU1MjIzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xNTM1NWUxYWUyNzE0M2ZhODQ2MmJiMWUxNmQzOWRkNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0zOCwgMTY0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNiMGZlYjYyMjVhZTQ5YmJhMDhjNDI5MTJmZjJhMDBiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E2YTM5Zjg5NmI0ODRmODY5MTU3ZWE0ODg1MGRkZWYxID0gJCgnPGRpdiBpZD0iaHRtbF9hNmEzOWY4OTZiNDg0Zjg2OTE1N2VhNDg4NTBkZGVmMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE2NDxicj5sYXQ6LTM4PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYjBmZWI2MjI1YWU0OWJiYTA4YzQyOTEyZmYyYTAwYi5zZXRDb250ZW50KGh0bWxfYTZhMzlmODk2YjQ4NGY4NjkxNTdlYTQ4ODUwZGRlZjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xNTM1NWUxYWUyNzE0M2ZhODQ2MmJiMWUxNmQzOWRkNy5iaW5kUG9wdXAocG9wdXBfM2IwZmViNjIyNWFlNDliYmEwOGM0MjkxMmZmMmEwMGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2JlNDhmZGY1MGFjNGMwMzk2ZmY2YTU0NzA5NjgzNTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNCwgMTY2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUyNTNkZDkwMjMyYzQyYzhhMTI2YjgyZTQ4M2YwOTZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZkZjVkZGUwZGE4ODRjZTk5MGEwMDQxYzUzYzQyOWNjID0gJCgnPGRpdiBpZD0iaHRtbF82ZGY1ZGRlMGRhODg0Y2U5OTBhMDA0MWM1M2M0MjljYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE2Njxicj5sYXQ6MzQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUyNTNkZDkwMjMyYzQyYzhhMTI2YjgyZTQ4M2YwOTZjLnNldENvbnRlbnQoaHRtbF82ZGY1ZGRlMGRhODg0Y2U5OTBhMDA0MWM1M2M0MjljYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NiZTQ4ZmRmNTBhYzRjMDM5NmZmNmE1NDcwOTY4MzU2LmJpbmRQb3B1cChwb3B1cF81MjUzZGQ5MDIzMmM0MmM4YTEyNmI4MmU0ODNmMDk2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kNDk2NDA5OWVhM2I0YThhODJlYzkyY2JlZjRhYzAzMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzIyLCAxMzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmMzZjdhZjRjYjQyNDYxNmJlZDk4N2UwZjNkNGM5YzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWYyNWJkNmNjMmFiNDhjODllODJiMWEzMjFhZjM1MmMgPSAkKCc8ZGl2IGlkPSJodG1sX2VmMjViZDZjYzJhYjQ4Yzg5ZTgyYjFhMzIxYWYzNTJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTM5PGJyPmxhdDoyMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmMzZjdhZjRjYjQyNDYxNmJlZDk4N2UwZjNkNGM5Yzguc2V0Q29udGVudChodG1sX2VmMjViZDZjYzJhYjQ4Yzg5ZTgyYjFhMzIxYWYzNTJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDQ5NjQwOTllYTNiNGE4YTgyZWM5MmNiZWY0YWMwMzEuYmluZFBvcHVwKHBvcHVwXzZjM2Y3YWY0Y2I0MjQ2MTZiZWQ5ODdlMGYzZDRjOWM4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Y0N2Q0NTIwYmVmNTRlNjY5MzFkYWI2OTYyZGIyZGJmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTYxLCAtNzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTM0MDdlMzE3NTcyNGNhOTg3MGE3YmQ0ZTQxZmFjOWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODc2Y2YxNzVlZmY0NDFmNTljOTIyOTViN2FlYWMzMjYgPSAkKCc8ZGl2IGlkPSJodG1sXzg3NmNmMTc1ZWZmNDQxZjU5YzkyMjk1YjdhZWFjMzI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTc5PGJyPmxhdDotNjE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UzNDA3ZTMxNzU3MjRjYTk4NzBhN2JkNGU0MWZhYzlkLnNldENvbnRlbnQoaHRtbF84NzZjZjE3NWVmZjQ0MWY1OWM5MjI5NWI3YWVhYzMyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y0N2Q0NTIwYmVmNTRlNjY5MzFkYWI2OTYyZGIyZGJmLmJpbmRQb3B1cChwb3B1cF9lMzQwN2UzMTc1NzI0Y2E5ODcwYTdiZDRlNDFmYWM5ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wMTE1M2YwOWFmNTI0NjZmYmUwYzNhM2E3NmEyMTY0YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM0LCAtMTEzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I4NTJlNWM0Y2IzMjQwNjNiZWRhNmFhYTRiYjU1ZjlkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQwNTcwMWU2Mzk2NjQzMmU5OTgyZjg1MTc2Y2ViZDMyID0gJCgnPGRpdiBpZD0iaHRtbF80MDU3MDFlNjM5NjY0MzJlOTk4MmY4NTE3NmNlYmQzMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xMTM8YnI+bGF0OjM0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iODUyZTVjNGNiMzI0MDYzYmVkYTZhYWE0YmI1NWY5ZC5zZXRDb250ZW50KGh0bWxfNDA1NzAxZTYzOTY2NDMyZTk5ODJmODUxNzZjZWJkMzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wMTE1M2YwOWFmNTI0NjZmYmUwYzNhM2E3NmEyMTY0Yi5iaW5kUG9wdXAocG9wdXBfYjg1MmU1YzRjYjMyNDA2M2JlZGE2YWFhNGJiNTVmOWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODZiYmRjMGVlNzRkNDc3OGFkZGE5YjJjNzE5ZGNlMzEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMiwgLTEyOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MGI0N2QzNGViNmU0MzkyYWFjMzlmMWE1ZGQ1YWRhYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNDA0NDUzMjU1Mzg0MWVjYmY4ZTY1ODVlMmFkNzEwMyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDQwNDQ1MzI1NTM4NDFlY2JmOGU2NTg1ZTJhZDcxMDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTI5PGJyPmxhdDotMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzBiNDdkMzRlYjZlNDM5MmFhYzM5ZjFhNWRkNWFkYWIuc2V0Q29udGVudChodG1sX2Q0MDQ0NTMyNTUzODQxZWNiZjhlNjU4NWUyYWQ3MTAzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODZiYmRjMGVlNzRkNDc3OGFkZGE5YjJjNzE5ZGNlMzEuYmluZFBvcHVwKHBvcHVwXzcwYjQ3ZDM0ZWI2ZTQzOTJhYWMzOWYxYTVkZDVhZGFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2VhNTVjMDU0OTMzMzQ1ZDI4MWIyNTlmODJiMmJmYTZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTQ4LCAtMTExXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JmNDM0NmRkYTVkZjQ5NTBiMDgwNzc4YjRhMjhlNTU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRkYzNiYmQ3ZmI4MjRhNmU5NDc2NmUxYTc0MWRkZDA4ID0gJCgnPGRpdiBpZD0iaHRtbF80ZGMzYmJkN2ZiODI0YTZlOTQ3NjZlMWE3NDFkZGQwOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xMTE8YnI+bGF0Oi00ODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmY0MzQ2ZGRhNWRmNDk1MGIwODA3NzhiNGEyOGU1NTcuc2V0Q29udGVudChodG1sXzRkYzNiYmQ3ZmI4MjRhNmU5NDc2NmUxYTc0MWRkZDA4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWE1NWMwNTQ5MzMzNDVkMjgxYjI1OWY4MmIyYmZhNmEuYmluZFBvcHVwKHBvcHVwX2JmNDM0NmRkYTVkZjQ5NTBiMDgwNzc4YjRhMjhlNTU3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2ZjNjA1NDk4MmI5MTQwY2E4ZDY3MGY0NjdlMGZmZDZkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTgsIDEyMF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MWJhNDVkMDNmNWM0M2ZiODkwNzdiYzMyYzQxYTQxYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NmRmZWE4ZWNiZDc0MmZjYmY0YjBkNjU0Mjg1NmExMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTZkZmVhOGVjYmQ3NDJmY2JmNGIwZDY1NDI4NTZhMTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoxMjA8YnI+bGF0Oi04PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MWJhNDVkMDNmNWM0M2ZiODkwNzdiYzMyYzQxYTQxYi5zZXRDb250ZW50KGh0bWxfNTZkZmVhOGVjYmQ3NDJmY2JmNGIwZDY1NDI4NTZhMTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mYzYwNTQ5ODJiOTE0MGNhOGQ2NzBmNDY3ZTBmZmQ2ZC5iaW5kUG9wdXAocG9wdXBfOTFiYTQ1ZDAzZjVjNDNmYjg5MDc3YmMzMmM0MWE0MWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTU4YjgxMTcxMDE3NGNkZGE4MDA3NGI5N2ViZDBkN2YgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsyMSwgOTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWI3YWJlYjNlYTUwNDAwNDkzZThhNjcxODc2OTVhNTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDQ2MjMxZmUwM2M0NGZlZTk0MjAxN2U5YzBhYTIwOGUgPSAkKCc8ZGl2IGlkPSJodG1sX2Q0NjIzMWZlMDNjNDRmZWU5NDIwMTdlOWMwYWEyMDhlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246OTY8YnI+bGF0OjIxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YjdhYmViM2VhNTA0MDA0OTNlOGE2NzE4NzY5NWE1MS5zZXRDb250ZW50KGh0bWxfZDQ2MjMxZmUwM2M0NGZlZTk0MjAxN2U5YzBhYTIwOGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lNThiODExNzEwMTc0Y2RkYTgwMDc0Yjk3ZWJkMGQ3Zi5iaW5kUG9wdXAocG9wdXBfNWI3YWJlYjNlYTUwNDAwNDkzZThhNjcxODc2OTVhNTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTkwYjAyMDdkMmNmNDY4OGIyMzQ1MWVkOTk5YjdlYWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjAsIC0xMjldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTYzYWI1ODIyYTQxNDc4Mzk5ZTkwMDgwOThlZGRlM2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmM3YzkwNjc0OWEzNDhhNmI0NDRlMGNiYTYzZTNmOWQgPSAkKCc8ZGl2IGlkPSJodG1sX2JjN2M5MDY3NDlhMzQ4YTZiNDQ0ZTBjYmE2M2UzZjlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTEyOTxicj5sYXQ6LTIwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNjNhYjU4MjJhNDE0NzgzOTllOTAwODA5OGVkZGUzYS5zZXRDb250ZW50KGh0bWxfYmM3YzkwNjc0OWEzNDhhNmI0NDRlMGNiYTYzZTNmOWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lOTBiMDIwN2QyY2Y0Njg4YjIzNDUxZWQ5OTliN2VhYS5iaW5kUG9wdXAocG9wdXBfMTYzYWI1ODIyYTQxNDc4Mzk5ZTkwMDgwOThlZGRlM2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODQwZjIyOGExMDNiNDM1MmE3ZjBiNjNhOGM1MzA4NWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjQsIC0xMTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzc0YjhkNzEzNDhkNDVmNzk0ZGQ0ZGE3YTQ4OWZlMzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjJhMDNkNjYwZjk5NDA5YWE5MjRmODg5MTZkZTQ5OTYgPSAkKCc8ZGl2IGlkPSJodG1sX2YyYTAzZDY2MGY5OTQwOWFhOTI0Zjg4OTE2ZGU0OTk2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTExMTxicj5sYXQ6LTI0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNzRiOGQ3MTM0OGQ0NWY3OTRkZDRkYTdhNDg5ZmUzMC5zZXRDb250ZW50KGh0bWxfZjJhMDNkNjYwZjk5NDA5YWE5MjRmODg5MTZkZTQ5OTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84NDBmMjI4YTEwM2I0MzUyYTdmMGI2M2E4YzUzMDg1ZS5iaW5kUG9wdXAocG9wdXBfMzc0YjhkNzEzNDhkNDVmNzk0ZGQ0ZGE3YTQ4OWZlMzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTZhYzdkMjlkNDMwNGMyN2FkNDNkZGUxODk1YTkzOTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszMCwgLTE0N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YTFiOTllNDJjMTc0NmRhYWFjNGVlYzg5ZGM0NTQwYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YjE5ZmM5OWMyNGY0MGJjYWZkYTg2N2NiODA1ZTM5YSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWIxOWZjOTljMjRmNDBiY2FmZGE4NjdjYjgwNWUzOWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTQ3PGJyPmxhdDozMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmExYjk5ZTQyYzE3NDZkYWFhYzRlZWM4OWRjNDU0MGEuc2V0Q29udGVudChodG1sXzliMTlmYzk5YzI0ZjQwYmNhZmRhODY3Y2I4MDVlMzlhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTZhYzdkMjlkNDMwNGMyN2FkNDNkZGUxODk1YTkzOTEuYmluZFBvcHVwKHBvcHVwXzZhMWI5OWU0MmMxNzQ2ZGFhYWM0ZWVjODlkYzQ1NDBhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2YzNmNhZTdhNzE0ZjQyMzFiNTVkNDdlMGIzOTA1ODMyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIwLCA3Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ODdlNjkxZDY3N2E0ZGYyYThkZDM1MmU0M2ZlZTU0ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YjhmMTc0NTlkMjk0MzFkYWI5M2Y4ZWE1ZDc0MzZiOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWI4ZjE3NDU5ZDI5NDMxZGFiOTNmOGVhNWQ3NDM2YjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjo3Njxicj5sYXQ6LTIwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ODdlNjkxZDY3N2E0ZGYyYThkZDM1MmU0M2ZlZTU0Zi5zZXRDb250ZW50KGh0bWxfNWI4ZjE3NDU5ZDI5NDMxZGFiOTNmOGVhNWQ3NDM2YjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mMzZjYWU3YTcxNGY0MjMxYjU1ZDQ3ZTBiMzkwNTgzMi5iaW5kUG9wdXAocG9wdXBfOTg3ZTY5MWQ2NzdhNGRmMmE4ZGQzNTJlNDNmZWU1NGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzJjMDNkZWRlOTdhNGIzZDk0YWE0ZjU2YjBkZmRmNDcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MSwgMTI5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I4ZWI5ZWE0NmYwZDRiYTg4OWM4YTI2ODQ1NjUyNGU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYyZTEwN2IwNDE3ZDQwYjE5ZTA5Y2RjZjlkM2U0OGMzID0gJCgnPGRpdiBpZD0iaHRtbF82MmUxMDdiMDQxN2Q0MGIxOWUwOWNkY2Y5ZDNlNDhjMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjEyOTxicj5sYXQ6NDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I4ZWI5ZWE0NmYwZDRiYTg4OWM4YTI2ODQ1NjUyNGU0LnNldENvbnRlbnQoaHRtbF82MmUxMDdiMDQxN2Q0MGIxOWUwOWNkY2Y5ZDNlNDhjMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzcyYzAzZGVkZTk3YTRiM2Q5NGFhNGY1NmIwZGZkZjQ3LmJpbmRQb3B1cChwb3B1cF9iOGViOWVhNDZmMGQ0YmE4ODljOGEyNjg0NTY1MjRlNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kNzE5MjUxNDc0Nzc0MjkyYjdmOWJiMDA3NjU4MzYwYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xMCwgMTQ1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2YjFhODUzYWE3NjQ3N2JiZGVhYmJjNmFjODdlZjFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM1MDg4ZGM5MTkwOTQ1ZGI4ZGRiMDViODliMGYzMmViID0gJCgnPGRpdiBpZD0iaHRtbF8zNTA4OGRjOTE5MDk0NWRiOGRkYjA1Yjg5YjBmMzJlYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE0NTxicj5sYXQ6LTEwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNmIxYTg1M2FhNzY0NzdiYmRlYWJiYzZhYzg3ZWYxYy5zZXRDb250ZW50KGh0bWxfMzUwODhkYzkxOTA5NDVkYjhkZGIwNWI4OWIwZjMyZWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kNzE5MjUxNDc0Nzc0MjkyYjdmOWJiMDA3NjU4MzYwYS5iaW5kUG9wdXAocG9wdXBfMTZiMWE4NTNhYTc2NDc3YmJkZWFiYmM2YWM4N2VmMWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDMzODFlZjA5OGIxNGNjM2JmMjBjYmE2OTc3YTZhN2YgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNDksIC03OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MzExZWE5ODkzMmQ0MzkzOGIyODhhNWE1OTJmZmJjMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xN2VkMjg2ZmI0ZTk0YzM2YTg5YWFmZmIxY2U3Mjc3ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTdlZDI4NmZiNGU5NGMzNmE4OWFhZmZiMWNlNzI3N2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotNzk8YnI+bGF0Oi00OTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzMxMWVhOTg5MzJkNDM5MzhiMjg4YTVhNTkyZmZiYzIuc2V0Q29udGVudChodG1sXzE3ZWQyODZmYjRlOTRjMzZhODlhYWZmYjFjZTcyNzdmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDMzODFlZjA5OGIxNGNjM2JmMjBjYmE2OTc3YTZhN2YuYmluZFBvcHVwKHBvcHVwXzczMTFlYTk4OTMyZDQzOTM4YjI4OGE1YTU5MmZmYmMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2IxZTViZDgzMzhlZjQ0MWJiZjdmY2E4MzliNWQ3ZWM0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcsIC03MF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZTFhMGE3ZGJkZWI0NjFmYTNkYzIzMTJhOGQzNGEwNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZjUyYjc0NDJiYjA0NTJmOGI3YjJmM2Q2ZTNmNmIxZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmY1MmI3NDQyYmIwNDUyZjhiN2IyZjNkNmUzZjZiMWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotNzA8YnI+bGF0OjM3PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZTFhMGE3ZGJkZWI0NjFmYTNkYzIzMTJhOGQzNGEwNy5zZXRDb250ZW50KGh0bWxfMmY1MmI3NDQyYmIwNDUyZjhiN2IyZjNkNmUzZjZiMWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iMWU1YmQ4MzM4ZWY0NDFiYmY3ZmNhODM5YjVkN2VjNC5iaW5kUG9wdXAocG9wdXBfZWUxYTBhN2RiZGViNDYxZmEzZGMyMzEyYThkMzRhMDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTVmNjBiZjAyMGIwNDJlZmJiOWUxNzkzNjQ5M2RlMzQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2NiwgMTQ4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEwMWFiOWE0OTM4OTQ3ODY4NWJhZjc1ODEzZTU1MmE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIyYzBiNDcxMDU4MjQwZjc4NTU0ZDJlMTk5Zjk0MGNiID0gJCgnPGRpdiBpZD0iaHRtbF8yMmMwYjQ3MTA1ODI0MGY3ODU1NGQyZTE5OWY5NDBjYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE0ODxicj5sYXQ6NjY8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwMWFiOWE0OTM4OTQ3ODY4NWJhZjc1ODEzZTU1MmE4LnNldENvbnRlbnQoaHRtbF8yMmMwYjQ3MTA1ODI0MGY3ODU1NGQyZTE5OWY5NDBjYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU1ZjYwYmYwMjBiMDQyZWZiYjllMTc5MzY0OTNkZTM0LmJpbmRQb3B1cChwb3B1cF8xMDFhYjlhNDkzODk0Nzg2ODViYWY3NTgxM2U1NTJhOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lODA0ODA2ZDkyNTI0NzRiOTliMGYwNzllMjlkMGQ2OSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy04OCwgLTEwNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNDI1ZDFkZDRhZjQ0YzA5YTM5ZjhjNjllZGVhMjA5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YmNlZjM2YzViZTQ0Y2RmYWIyMTUwYTRjNWMzYTcwZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNGJjZWYzNmM1YmU0NGNkZmFiMjE1MGE0YzVjM2E3MGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTA0PGJyPmxhdDotODg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M0MjVkMWRkNGFmNDRjMDlhMzlmOGM2OWVkZWEyMDk3LnNldENvbnRlbnQoaHRtbF80YmNlZjM2YzViZTQ0Y2RmYWIyMTUwYTRjNWMzYTcwZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U4MDQ4MDZkOTI1MjQ3NGI5OWIwZjA3OWUyOWQwZDY5LmJpbmRQb3B1cChwb3B1cF9jNDI1ZDFkZDRhZjQ0YzA5YTM5ZjhjNjllZGVhMjA5Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83Nzc0OTA3MmEyMDM0NWI2YjcxOGMwYWE4OThlNWRlOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy01MSwgLTddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWVjOWI1NGFjZTk0NGEzYjlhMzQ4NzBkOGU3ZDQxMGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2Q1OGIzYmFjNGI1NDc4MzllODNkNzU5MDZlMWFkMDkgPSAkKCc8ZGl2IGlkPSJodG1sXzNkNThiM2JhYzRiNTQ3ODM5ZTgzZDc1OTA2ZTFhZDA5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTc8YnI+bGF0Oi01MTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWVjOWI1NGFjZTk0NGEzYjlhMzQ4NzBkOGU3ZDQxMGMuc2V0Q29udGVudChodG1sXzNkNThiM2JhYzRiNTQ3ODM5ZTgzZDc1OTA2ZTFhZDA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzc3NDkwNzJhMjAzNDViNmI3MThjMGFhODk4ZTVkZTguYmluZFBvcHVwKHBvcHVwXzFlYzliNTRhY2U5NDRhM2I5YTM0ODcwZDhlN2Q0MTBjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzU3NWY0OTJiYTUxMTQ5MTY4NGQ3YWRhZGVmMDNlMTk1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNjIsIDExOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZDI2YzFlNDlmMGI0ZWU0YjQ0ODE2MGZlYmEyMjE4NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YWU4NTVlMWZhMzM0Zjc1YWM5ZWU4MzdhMTNiNTVmNCA9ICQoJzxkaXYgaWQ9Imh0bWxfOGFlODU1ZTFmYTMzNGY3NWFjOWVlODM3YTEzYjU1ZjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoxMTg8YnI+bGF0OjYyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZDI2YzFlNDlmMGI0ZWU0YjQ0ODE2MGZlYmEyMjE4Ni5zZXRDb250ZW50KGh0bWxfOGFlODU1ZTFmYTMzNGY3NWFjOWVlODM3YTEzYjU1ZjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81NzVmNDkyYmE1MTE0OTE2ODRkN2FkYWRlZjAzZTE5NS5iaW5kUG9wdXAocG9wdXBfMGQyNmMxZTQ5ZjBiNGVlNGI0NDgxNjBmZWJhMjIxODYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGU5MzE5Nzk3YjMzNDlmZDhlZDRiMWQzNjk3ZTBjNTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMzcsIDExN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYzFkN2NmYjE1NTI0Nzg1OGMxMzY5ZTU1NWU5YTUyOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YThiYTBhNjdhM2U0ODA0OTYzNTc3ODkyNGFmNGEyYiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGE4YmEwYTY3YTNlNDgwNDk2MzU3Nzg5MjRhZjRhMmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoxMTc8YnI+bGF0Oi0zNzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGMxZDdjZmIxNTUyNDc4NThjMTM2OWU1NTVlOWE1Mjguc2V0Q29udGVudChodG1sXzhhOGJhMGE2N2EzZTQ4MDQ5NjM1Nzc4OTI0YWY0YTJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGU5MzE5Nzk3YjMzNDlmZDhlZDRiMWQzNjk3ZTBjNTguYmluZFBvcHVwKHBvcHVwX2RjMWQ3Y2ZiMTU1MjQ3ODU4YzEzNjllNTU1ZTlhNTI4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2NlYTlkYmFkYWFkNTQ1MmY4NTc1ODFlNTg4YjM0Nzk4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTY4LCAtODBdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDA0OGRlZDlkNTNhNDExZWE2NDg5YjdmYmM2MDdjODkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDgwN2VhZjZlZjZjNDcyN2IyM2U2NTk1MmE5NzA3ODcgPSAkKCc8ZGl2IGlkPSJodG1sXzA4MDdlYWY2ZWY2YzQ3MjdiMjNlNjU5NTJhOTcwNzg3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTgwPGJyPmxhdDotNjg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QwNDhkZWQ5ZDUzYTQxMWVhNjQ4OWI3ZmJjNjA3Yzg5LnNldENvbnRlbnQoaHRtbF8wODA3ZWFmNmVmNmM0NzI3YjIzZTY1OTUyYTk3MDc4Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NlYTlkYmFkYWFkNTQ1MmY4NTc1ODFlNTg4YjM0Nzk4LmJpbmRQb3B1cChwb3B1cF9kMDQ4ZGVkOWQ1M2E0MTFlYTY0ODliN2ZiYzYwN2M4OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wNmM0ZWZmNmViNzI0OTNiYTg3MzdiODU5ZDVmM2ZlNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzY5LCAtMTI2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc3MDU0ZDY4MWQ5YjRhOGNiNDdkMGQ5MzY4NDNhOThiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYzNGNmMTNjMmFjYjQ2NDM4YjkxM2Q0MDM1YjE2YmNjID0gJCgnPGRpdiBpZD0iaHRtbF82MzRjZjEzYzJhY2I0NjQzOGI5MTNkNDAzNWIxNmJjYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xMjY8YnI+bGF0OjY5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NzA1NGQ2ODFkOWI0YThjYjQ3ZDBkOTM2ODQzYTk4Yi5zZXRDb250ZW50KGh0bWxfNjM0Y2YxM2MyYWNiNDY0MzhiOTEzZDQwMzViMTZiY2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wNmM0ZWZmNmViNzI0OTNiYTg3MzdiODU5ZDVmM2ZlNC5iaW5kUG9wdXAocG9wdXBfNzcwNTRkNjgxZDliNGE4Y2I0N2QwZDkzNjg0M2E5OGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWQ5ZjZjYzlkZGU2NDFhMGFjNGI5YzRmOGQ4NzEzZjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0LCAyN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNjBkNTVmOTAxYTk0NWU0ODllMzkwYjk2MjU3YzUwMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNWQyNmExZGYzMGM0NzFkOTZjMTllZmQ5ZTIyOTFjMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjVkMjZhMWRmMzBjNDcxZDk2YzE5ZWZkOWUyMjkxYzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoyNzxicj5sYXQ6NDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzYwZDU1ZjkwMWE5NDVlNDg5ZTM5MGI5NjI1N2M1MDIuc2V0Q29udGVudChodG1sX2Y1ZDI2YTFkZjMwYzQ3MWQ5NmMxOWVmZDllMjI5MWMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOWQ5ZjZjYzlkZGU2NDFhMGFjNGI5YzRmOGQ4NzEzZjguYmluZFBvcHVwKHBvcHVwX2M2MGQ1NWY5MDFhOTQ1ZTQ4OWUzOTBiOTYyNTdjNTAyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2NjZmNiMWZmMTA0YjRkMjliOGY2ZjJiOGYwODg5OGYyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbODgsIDU0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU1ZDYzMDNlYzVjYTRjMmI5NmVjOWRkNjhlNTUyYzAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE4ZDFmZmEwYWZjOTQ3NjY4M2Y0NjhlODAyODc4MzU4ID0gJCgnPGRpdiBpZD0iaHRtbF8xOGQxZmZhMGFmYzk0NzY2ODNmNDY4ZTgwMjg3ODM1OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjU0PGJyPmxhdDo4ODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTVkNjMwM2VjNWNhNGMyYjk2ZWM5ZGQ2OGU1NTJjMDEuc2V0Q29udGVudChodG1sXzE4ZDFmZmEwYWZjOTQ3NjY4M2Y0NjhlODAyODc4MzU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2NmY2IxZmYxMDRiNGQyOWI4ZjZmMmI4ZjA4ODk4ZjIuYmluZFBvcHVwKHBvcHVwXzU1ZDYzMDNlYzVjYTRjMmI5NmVjOWRkNjhlNTUyYzAxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2QxYjM4M2I4OTY2NzRlNjdiYmJlZTk4NDg1NGJjNTRiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTgsIDE3MF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMzc2N2IxYjgxYWU0NDdlYWYxODZiMjEzNTllN2IzYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZTEwZTlkMTQ4OTE0YWYyOWFlY2VhNDQ4NzcyOGFlMSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWUxMGU5ZDE0ODkxNGFmMjlhZWNlYTQ0ODc3MjhhZTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoxNzA8YnI+bGF0Oi04PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMzc2N2IxYjgxYWU0NDdlYWYxODZiMjEzNTllN2IzYi5zZXRDb250ZW50KGh0bWxfOWUxMGU5ZDE0ODkxNGFmMjlhZWNlYTQ0ODc3MjhhZTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kMWIzODNiODk2Njc0ZTY3YmJiZWU5ODQ4NTRiYzU0Yi5iaW5kUG9wdXAocG9wdXBfMTM3NjdiMWI4MWFlNDQ3ZWFmMTg2YjIxMzU5ZTdiM2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTg1OTcxYjI0YjA0NDQ4YzkwMDhhYmY0YTU1MWQzZmMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxOCwgMTc4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA5ZjA3NmEwNTIxNTQ3YThhNjI2OGEwODdmZTBlZjc1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0ODcwMzM3MjBiOTRjN2U4ZDAwODUxMTE0ZDVmYWU3ID0gJCgnPGRpdiBpZD0iaHRtbF8zNDg3MDMzNzIwYjk0YzdlOGQwMDg1MTExNGQ1ZmFlNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE3ODxicj5sYXQ6MTg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA5ZjA3NmEwNTIxNTQ3YThhNjI2OGEwODdmZTBlZjc1LnNldENvbnRlbnQoaHRtbF8zNDg3MDMzNzIwYjk0YzdlOGQwMDg1MTExNGQ1ZmFlNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE4NTk3MWIyNGIwNDQ0OGM5MDA4YWJmNGE1NTFkM2ZjLmJpbmRQb3B1cChwb3B1cF8wOWYwNzZhMDUyMTU0N2E4YTYyNjhhMDg3ZmUwZWY3NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wM2YzOWIyZTNmNzg0MWE2YmZhMDRhN2Y3MjQwZDMzOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUzLCAtMTc0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhhOTYyNjhkMGRmZDQ1MjI4YzkzMmZmYzU2MmIzMzJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRhODg3NDI4NTUwNzRiOGFiNTYwMTk4NWE0M2JlYmQwID0gJCgnPGRpdiBpZD0iaHRtbF80YTg4NzQyODU1MDc0YjhhYjU2MDE5ODVhNDNiZWJkMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xNzQ8YnI+bGF0OjUzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YTk2MjY4ZDBkZmQ0NTIyOGM5MzJmZmM1NjJiMzMyYy5zZXRDb250ZW50KGh0bWxfNGE4ODc0Mjg1NTA3NGI4YWI1NjAxOTg1YTQzYmViZDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wM2YzOWIyZTNmNzg0MWE2YmZhMDRhN2Y3MjQwZDMzOS5iaW5kUG9wdXAocG9wdXBfOGE5NjI2OGQwZGZkNDUyMjhjOTMyZmZjNTYyYjMzMmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTFiZmJlYTgzNWFmNGE1ZjliYjBjOGM4MTEzZWFjODggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxOSwgMTc4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhkMGZkYTVhZjc5MTQ5ZTk4ZmE1ZWZlOGZhMTNiOGM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MyN2JhMTQ2ZGQ1YzRiYzRhM2ZjZTEzNTU0NTQ1ZWMyID0gJCgnPGRpdiBpZD0iaHRtbF9jMjdiYTE0NmRkNWM0YmM0YTNmY2UxMzU1NDU0NWVjMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE3ODxicj5sYXQ6MTk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhkMGZkYTVhZjc5MTQ5ZTk4ZmE1ZWZlOGZhMTNiOGM3LnNldENvbnRlbnQoaHRtbF9jMjdiYTE0NmRkNWM0YmM0YTNmY2UxMzU1NDU0NWVjMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUxYmZiZWE4MzVhZjRhNWY5YmIwYzhjODExM2VhYzg4LmJpbmRQb3B1cChwb3B1cF84ZDBmZGE1YWY3OTE0OWU5OGZhNWVmZThmYTEzYjhjNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMDMxYzQyNWI1YWU0OTE0ODNjNDJhZmQzMzkwNmE0YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00OSwgLTE4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q4YzAxZTk1ZTdlZDRhYTliMjUwYjM5NGFmOThmNmRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdkZDdjNDVkNzhmYTQ5MTRhOTBiYTNiMjc4NzJkM2U4ID0gJCgnPGRpdiBpZD0iaHRtbF83ZGQ3YzQ1ZDc4ZmE0OTE0YTkwYmEzYjI3ODcyZDNlOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xODxicj5sYXQ6LTQ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOGMwMWU5NWU3ZWQ0YWE5YjI1MGIzOTRhZjk4ZjZkYy5zZXRDb250ZW50KGh0bWxfN2RkN2M0NWQ3OGZhNDkxNGE5MGJhM2IyNzg3MmQzZTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zMDMxYzQyNWI1YWU0OTE0ODNjNDJhZmQzMzkwNmE0Yy5iaW5kUG9wdXAocG9wdXBfZDhjMDFlOTVlN2VkNGFhOWIyNTBiMzk0YWY5OGY2ZGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTNhZDNlMmNhMjczNDRiNTg2NmViMWI2YjA0NDk0NDQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstODksIC05N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNjVjYWM4Y2QzNjQ0YzJjOTVmYjA4OTEwMmQ3ZjRiOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYmQyZDc3OThjYmM0M2NiODY4MDUyM2IyODViNTdiYSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmJkMmQ3Nzk4Y2JjNDNjYjg2ODA1MjNiMjg1YjU3YmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotOTc8YnI+bGF0Oi04OTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDY1Y2FjOGNkMzY0NGMyYzk1ZmIwODkxMDJkN2Y0Yjguc2V0Q29udGVudChodG1sX2JiZDJkNzc5OGNiYzQzY2I4NjgwNTIzYjI4NWI1N2JhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTNhZDNlMmNhMjczNDRiNTg2NmViMWI2YjA0NDk0NDQuYmluZFBvcHVwKHBvcHVwX2Q2NWNhYzhjZDM2NDRjMmM5NWZiMDg5MTAyZDdmNGI4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhhODFlODk1NDUwMzQ5ZTg5MjEwNjMyMDYwYzI0YjdjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTgxLCAtOTNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDhiNjBmMTJhNTkzNGYxNmIwMGI1NGRmMTdmNTc4NGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjU0OWYzZjdmNjU5NDc1OWI2ZGU0ZDRjNmExZWJkNjMgPSAkKCc8ZGl2IGlkPSJodG1sXzY1NDlmM2Y3ZjY1OTQ3NTliNmRlNGQ0YzZhMWViZDYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTkzPGJyPmxhdDotODE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA4YjYwZjEyYTU5MzRmMTZiMDBiNTRkZjE3ZjU3ODRhLnNldENvbnRlbnQoaHRtbF82NTQ5ZjNmN2Y2NTk0NzU5YjZkZTRkNGM2YTFlYmQ2Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzhhODFlODk1NDUwMzQ5ZTg5MjEwNjMyMDYwYzI0YjdjLmJpbmRQb3B1cChwb3B1cF8wOGI2MGYxMmE1OTM0ZjE2YjAwYjU0ZGYxN2Y1Nzg0YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mYjlmMmNlMzgyZWY0MjYyOWQzMzE3OTkyNTNjYmE3YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LCAyNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYzJjZGEzNjViMDU0YTYxYmM4NGI4ZDYxODE1ZmY3MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYjUwODdkOWUyM2M0Y2JiOGNiNDJjNGZkYmZjODU4NiA9ICQoJzxkaXYgaWQ9Imh0bWxfMWI1MDg3ZDllMjNjNGNiYjhjYjQyYzRmZGJmYzg1ODYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoyNDxicj5sYXQ6Mzc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJjMmNkYTM2NWIwNTRhNjFiYzg0YjhkNjE4MTVmZjcxLnNldENvbnRlbnQoaHRtbF8xYjUwODdkOWUyM2M0Y2JiOGNiNDJjNGZkYmZjODU4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2ZiOWYyY2UzODJlZjQyNjI5ZDMzMTc5OTI1M2NiYTdiLmJpbmRQb3B1cChwb3B1cF8yYzJjZGEzNjViMDU0YTYxYmM4NGI4ZDYxODE1ZmY3MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kZWQ1ZTkxYmFmMWU0MjFmYTcxYjQ1YjRkMjU0MTQyMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzIwLCAtNzhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGZhMjRmOWM4ZWM1NDA0ZjhhMjVjYzY4YmVjMzA3MTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTBlYzk4MDRlZGU2NDUzYThhZGQ4ZGY4YzM1Yzc4NDggPSAkKCc8ZGl2IGlkPSJodG1sXzkwZWM5ODA0ZWRlNjQ1M2E4YWRkOGRmOGMzNWM3ODQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTc4PGJyPmxhdDoyMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGZhMjRmOWM4ZWM1NDA0ZjhhMjVjYzY4YmVjMzA3MTIuc2V0Q29udGVudChodG1sXzkwZWM5ODA0ZWRlNjQ1M2E4YWRkOGRmOGMzNWM3ODQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGVkNWU5MWJhZjFlNDIxZmE3MWI0NWI0ZDI1NDE0MjIuYmluZFBvcHVwKHBvcHVwX2RmYTI0ZjljOGVjNTQwNGY4YTI1Y2M2OGJlYzMwNzEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzc5MzZhZGYxNzI4NjQwODg4MmFiYjNmNGEzMTY2ZjBiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTksIC0zOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNDFiMDJhM2U4OGE0NmU3YTU0ZjkwZDkyMzY1YzIxNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYmY1NWM0MDMzMDI0MmJkYmYzNjc4NjQ5ZDU2NTNkYSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWJmNTVjNDAzMzAyNDJiZGJmMzY3ODY0OWQ1NjUzZGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMzk8YnI+bGF0OjU5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNDFiMDJhM2U4OGE0NmU3YTU0ZjkwZDkyMzY1YzIxNS5zZXRDb250ZW50KGh0bWxfYWJmNTVjNDAzMzAyNDJiZGJmMzY3ODY0OWQ1NjUzZGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83OTM2YWRmMTcyODY0MDg4ODJhYmIzZjRhMzE2NmYwYi5iaW5kUG9wdXAocG9wdXBfZDQxYjAyYTNlODhhNDZlN2E1NGY5MGQ5MjM2NWMyMTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDAzNmM2MWJmMDdlNDVmNWIzMmJjN2JhZjhkMmRhZjMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNjEsIDMyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M0NDRhOGNkN2RjODRiMDBhOGZiOThjNTI3ZDY1ZjA2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA1ZWFiNGQ0NmJhYjQ1YTdhYmM0NTEwODBmMDI3ZWVlID0gJCgnPGRpdiBpZD0iaHRtbF8wNWVhYjRkNDZiYWI0NWE3YWJjNDUxMDgwZjAyN2VlZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjMyPGJyPmxhdDotNjE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M0NDRhOGNkN2RjODRiMDBhOGZiOThjNTI3ZDY1ZjA2LnNldENvbnRlbnQoaHRtbF8wNWVhYjRkNDZiYWI0NWE3YWJjNDUxMDgwZjAyN2VlZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzAwMzZjNjFiZjA3ZTQ1ZjViMzJiYzdiYWY4ZDJkYWYzLmJpbmRQb3B1cChwb3B1cF9jNDQ0YThjZDdkYzg0YjAwYThmYjk4YzUyN2Q2NWYwNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83NWMzNTU2MmFjMTk0ZWM1YjJkNjE1YThjOTM3MWVlOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU5LCAtMTM5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjMGE3ZDVjMzg3MTQwNWRiYzAxMjUxMDIwZWE4NjNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4YmEwZjI1MmZmOTQzMzU4Y2Q4ZDc5NWNjNGUzMjdjID0gJCgnPGRpdiBpZD0iaHRtbF82OGJhMGYyNTJmZjk0MzM1OGNkOGQ3OTVjYzRlMzI3YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xMzk8YnI+bGF0OjU5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYzBhN2Q1YzM4NzE0MDVkYmMwMTI1MTAyMGVhODYzZS5zZXRDb250ZW50KGh0bWxfNjhiYTBmMjUyZmY5NDMzNThjZDhkNzk1Y2M0ZTMyN2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83NWMzNTU2MmFjMTk0ZWM1YjJkNjE1YThjOTM3MWVlOC5iaW5kUG9wdXAocG9wdXBfZGMwYTdkNWMzODcxNDA1ZGJjMDEyNTEwMjBlYTg2M2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGY4N2I3MzE2NGJkNGMyZmFjYjVkYjAyMzIxMmI5MjQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2NSwgOTRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTE0ZDlkZDk0YmI4NGYxNjlhZGU5ZGJjYWVhMzE3OTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTAwYjZlNjI1N2VmNDNlODkzYjI4NWNmYTU3YWNlOGEgPSAkKCc8ZGl2IGlkPSJodG1sX2UwMGI2ZTYyNTdlZjQzZTg5M2IyODVjZmE1N2FjZThhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246OTQ8YnI+bGF0OjY1PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MTRkOWRkOTRiYjg0ZjE2OWFkZTlkYmNhZWEzMTc5NS5zZXRDb250ZW50KGh0bWxfZTAwYjZlNjI1N2VmNDNlODkzYjI4NWNmYTU3YWNlOGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kZjg3YjczMTY0YmQ0YzJmYWNiNWRiMDIzMjEyYjkyNC5iaW5kUG9wdXAocG9wdXBfOTE0ZDlkZDk0YmI4NGYxNjlhZGU5ZGJjYWVhMzE3OTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZThjYzcwNWQzZTA0NGY0ODllZGViNDVjNzEyMzFmYWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszMywgLTE0M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lN2FlYWQzMWRiYTM0OGY0ODhhOWI1NzQ2NDQyZGJhMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kY2Y3Nzg2YjhiYjU0Nzg0OTYzNDA4M2VjN2I1NDlkMiA9ICQoJzxkaXYgaWQ9Imh0bWxfZGNmNzc4NmI4YmI1NDc4NDk2MzQwODNlYzdiNTQ5ZDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTQzPGJyPmxhdDozMzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTdhZWFkMzFkYmEzNDhmNDg4YTliNTc0NjQ0MmRiYTEuc2V0Q29udGVudChodG1sX2RjZjc3ODZiOGJiNTQ3ODQ5NjM0MDgzZWM3YjU0OWQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZThjYzcwNWQzZTA0NGY0ODllZGViNDVjNzEyMzFmYWUuYmluZFBvcHVwKHBvcHVwX2U3YWVhZDMxZGJhMzQ4ZjQ4OGE5YjU3NDY0NDJkYmExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzg5NzQ2ZWM3ZTI2ZTQyZmJiYjdjYjk5MDc1MmQ1OWI2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTQ5LCA1N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jOGU5ZTc1NmU0OTg0NDc3YjQwOGQ2MTE0ZGU3YjhiNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZDg4Mjg0ZDIyZWI0MGViOGEwNTU5NGE3MTNiMjczZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZmQ4ODI4NGQyMmViNDBlYjhhMDU1OTRhNzEzYjI3M2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjo1Nzxicj5sYXQ6LTQ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jOGU5ZTc1NmU0OTg0NDc3YjQwOGQ2MTE0ZGU3YjhiNy5zZXRDb250ZW50KGh0bWxfZmQ4ODI4NGQyMmViNDBlYjhhMDU1OTRhNzEzYjI3M2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84OTc0NmVjN2UyNmU0MmZiYmI3Y2I5OTA3NTJkNTliNi5iaW5kUG9wdXAocG9wdXBfYzhlOWU3NTZlNDk4NDQ3N2I0MDhkNjExNGRlN2I4YjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjUxNGVkMjdiY2E5NGJmMzk4YWQ1MDJmMDg0MjRjOWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2LCAxMjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTgwMWQ5YzFlMTM5NGJkNDk5NjAwMTI2MDg2M2Y3ZTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDE2ZTQyMDYzMjVhNGY4Y2JiMmIzMGIxZjQwOGY0OTAgPSAkKCc8ZGl2IGlkPSJodG1sXzAxNmU0MjA2MzI1YTRmOGNiYjJiMzBiMWY0MDhmNDkwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTIzPGJyPmxhdDo2PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lODAxZDljMWUxMzk0YmQ0OTk2MDAxMjYwODYzZjdlMC5zZXRDb250ZW50KGh0bWxfMDE2ZTQyMDYzMjVhNGY4Y2JiMmIzMGIxZjQwOGY0OTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82NTE0ZWQyN2JjYTk0YmYzOThhZDUwMmYwODQyNGM5Yy5iaW5kUG9wdXAocG9wdXBfZTgwMWQ5YzFlMTM5NGJkNDk5NjAwMTI2MDg2M2Y3ZTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjAzNTI2YmUzMGM2NDZkOWJlOTI3YzQ2ZDg0MDc1MTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNjQsIC01Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NTM2MDJiMWU0YjE0OTMyYmFkMGQxZDc1NzVmYzhlNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82OWMwNzYyMjk5YTE0YTdiOGFjNjIwNTdjMzM1NGNjYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjljMDc2MjI5OWExNGE3YjhhYzYyMDU3YzMzNTRjY2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotNTY8YnI+bGF0Oi02NDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTUzNjAyYjFlNGIxNDkzMmJhZDBkMWQ3NTc1ZmM4ZTQuc2V0Q29udGVudChodG1sXzY5YzA3NjIyOTlhMTRhN2I4YWM2MjA1N2MzMzU0Y2NiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjAzNTI2YmUzMGM2NDZkOWJlOTI3YzQ2ZDg0MDc1MTcuYmluZFBvcHVwKHBvcHVwXzU1MzYwMmIxZTRiMTQ5MzJiYWQwZDFkNzU3NWZjOGU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzJiNTY3ZDhmNzJlMjQ1NDU4OTQ4OThjNzljNmVmNzM3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQsIDUyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI4ZDljYzhiOTU0ODQ4YWFiMTQ1Y2QwYzQzYmRjNzJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I0OTVlMzBmY2UzNTRhNGU5MWM1ZGFlY2RkM2ZjNzAxID0gJCgnPGRpdiBpZD0iaHRtbF9iNDk1ZTMwZmNlMzU0YTRlOTFjNWRhZWNkZDNmYzcwMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjUyPGJyPmxhdDo1NDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjhkOWNjOGI5NTQ4NDhhYWIxNDVjZDBjNDNiZGM3MmIuc2V0Q29udGVudChodG1sX2I0OTVlMzBmY2UzNTRhNGU5MWM1ZGFlY2RkM2ZjNzAxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmI1NjdkOGY3MmUyNDU0NTg5NDg5OGM3OWM2ZWY3MzcuYmluZFBvcHVwKHBvcHVwXzI4ZDljYzhiOTU0ODQ4YWFiMTQ1Y2QwYzQzYmRjNzJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2VkMDQzODgzYmM0NzQxMzVhYjkzMTMzMzRmZDMwNDhjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTI3LCAxMTBdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTkxMjNlODkwNWYyNDRhN2E0MDVlZjY0MDEzMTc5MjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWI5YjljNTlhOWY2NGFjMWJkMjA5ZDU2MmQ5NmQ2ZDMgPSAkKCc8ZGl2IGlkPSJodG1sXzFiOWI5YzU5YTlmNjRhYzFiZDIwOWQ1NjJkOTZkNmQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTEwPGJyPmxhdDotMjc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5MTIzZTg5MDVmMjQ0YTdhNDA1ZWY2NDAxMzE3OTI2LnNldENvbnRlbnQoaHRtbF8xYjliOWM1OWE5ZjY0YWMxYmQyMDlkNTYyZDk2ZDZkMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2VkMDQzODgzYmM0NzQxMzVhYjkzMTMzMzRmZDMwNDhjLmJpbmRQb3B1cChwb3B1cF85OTEyM2U4OTA1ZjI0NGE3YTQwNWVmNjQwMTMxNzkyNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81MDI2ZmZmNTlhMTc0NTIwYjI0OTA3NWVjOTZiNWYxNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy04MiwgLTE0N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMGRmYmJlYmI3MDQ0YzA4YjAyYzBkMmM0ZjAwZGU5MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNDhjYWMzYTA4YjY0ZDg2OTMyNDY2MTk0M2EwYWVhMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjQ4Y2FjM2EwOGI2NGQ4NjkzMjQ2NjE5NDNhMGFlYTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTQ3PGJyPmxhdDotODI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IwZGZiYmViYjcwNDRjMDhiMDJjMGQyYzRmMDBkZTkwLnNldENvbnRlbnQoaHRtbF8yNDhjYWMzYTA4YjY0ZDg2OTMyNDY2MTk0M2EwYWVhMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUwMjZmZmY1OWExNzQ1MjBiMjQ5MDc1ZWM5NmI1ZjE1LmJpbmRQb3B1cChwb3B1cF9iMGRmYmJlYmI3MDQ0YzA4YjAyYzBkMmM0ZjAwZGU5MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80YTM5MjBkOTg4NTA0ZDViYmUzNGE0ZTViNmY3NzVkZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00OSwgLTExM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMzVkZDU2YTY4N2U0ZTQwYTM5YmMwODY4OTgxOGRkNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMjZiZTE2ZjE0ODQ0Yzc0YmRlYTUwNDM5ZTAwMDU0OSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTI2YmUxNmYxNDg0NGM3NGJkZWE1MDQzOWUwMDA1NDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTEzPGJyPmxhdDotNDk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMzNWRkNTZhNjg3ZTRlNDBhMzliYzA4Njg5ODE4ZGQ0LnNldENvbnRlbnQoaHRtbF8xMjZiZTE2ZjE0ODQ0Yzc0YmRlYTUwNDM5ZTAwMDU0OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRhMzkyMGQ5ODg1MDRkNWJiZTM0YTRlNWI2Zjc3NWRlLmJpbmRQb3B1cChwb3B1cF8zMzVkZDU2YTY4N2U0ZTQwYTM5YmMwODY4OTgxOGRkNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82NmQ1NGFlZmE5OGU0NTYzYTNhMTgwMDA4ZGZjZjk0YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMCwgLTE0NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMDQ3MDNkYWI2ZGE0OTY1YjQzMGEzMWEyMmVlMzUzNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZTE4ODZlYjE5ODY0OTZjYTE5MTlkMWM1YmIzNTYyZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWUxODg2ZWIxOTg2NDk2Y2ExOTE5ZDFjNWJiMzU2MmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTQ1PGJyPmxhdDotMjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwNDcwM2RhYjZkYTQ5NjViNDMwYTMxYTIyZWUzNTM0LnNldENvbnRlbnQoaHRtbF81ZTE4ODZlYjE5ODY0OTZjYTE5MTlkMWM1YmIzNTYyZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY2ZDU0YWVmYTk4ZTQ1NjNhM2ExODAwMDhkZmNmOTRjLmJpbmRQb3B1cChwb3B1cF9hMDQ3MDNkYWI2ZGE0OTY1YjQzMGEzMWEyMmVlMzUzNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jMDU0MTk3NWQ3OWE0OGYzYjA3MWJlOWEzZjk4NTdhYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU5LCA1Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYmJiMWFkY2VlNDQ0OGNiODc4Y2ZhNzY0NmY1MGJlYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YTQ5ZmM5NGNkNWM0MTllYjFhMTQ2OWZiZGFlYzFmMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNWE0OWZjOTRjZDVjNDE5ZWIxYTE0NjlmYmRhZWMxZjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjo1Njxicj5sYXQ6NTk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNiYmIxYWRjZWU0NDQ4Y2I4NzhjZmE3NjQ2ZjUwYmVjLnNldENvbnRlbnQoaHRtbF81YTQ5ZmM5NGNkNWM0MTllYjFhMTQ2OWZiZGFlYzFmMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2MwNTQxOTc1ZDc5YTQ4ZjNiMDcxYmU5YTNmOTg1N2FiLmJpbmRQb3B1cChwb3B1cF8zYmJiMWFkY2VlNDQ0OGNiODc4Y2ZhNzY0NmY1MGJlYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lNTQ4MjUxMjk5MzI0ODkwODZlZTQwMWQ3YWRmNmQ4ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU1LCAxMDZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTAwNmM5NTc1ZTdmNDJmODkwODFkZDUyZjRkMWYzOWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzUyODRjYjE1YjllNDI0N2I0MjQxMzRjMGI0NGI0YTggPSAkKCc8ZGl2IGlkPSJodG1sX2M1Mjg0Y2IxNWI5ZTQyNDdiNDI0MTM0YzBiNDRiNGE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTA2PGJyPmxhdDo1NTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTAwNmM5NTc1ZTdmNDJmODkwODFkZDUyZjRkMWYzOWEuc2V0Q29udGVudChodG1sX2M1Mjg0Y2IxNWI5ZTQyNDdiNDI0MTM0YzBiNDRiNGE4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTU0ODI1MTI5OTMyNDg5MDg2ZWU0MDFkN2FkZjZkOGYuYmluZFBvcHVwKHBvcHVwXzUwMDZjOTU3NWU3ZjQyZjg5MDgxZGQ1MmY0ZDFmMzlhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzM3ZmZhZjJhNzViNTRhNWVhOTg5YWQ2YzdiNDBjMjM1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTg1LCAtNjZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTA3Y2YzNWE0ZjYzNGQzNDg1NDJiMzFlZGRmMTVmNTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWE1ZDM4YWMzNGVjNGVlNmEyNmEyODk1NzhiMWJhYzggPSAkKCc8ZGl2IGlkPSJodG1sXzlhNWQzOGFjMzRlYzRlZTZhMjZhMjg5NTc4YjFiYWM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTY2PGJyPmxhdDotODU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwN2NmMzVhNGY2MzRkMzQ4NTQyYjMxZWRkZjE1ZjU1LnNldENvbnRlbnQoaHRtbF85YTVkMzhhYzM0ZWM0ZWU2YTI2YTI4OTU3OGIxYmFjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzM3ZmZhZjJhNzViNTRhNWVhOTg5YWQ2YzdiNDBjMjM1LmJpbmRQb3B1cChwb3B1cF9hMDdjZjM1YTRmNjM0ZDM0ODU0MmIzMWVkZGYxNWY1NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xYTU1ZTQyNWEwNTA0NDdkOGRlMGU0NDJjODExOTQyNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy04NiwgLTE2Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMmU5NWI2NTRhMWU0OWNkYTgyMzJhMjY3NmFjMzU2MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZDNmYWVjZTE4ZmY0N2E2YTFjMGYyMzU5NzM0N2U0YiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGQzZmFlY2UxOGZmNDdhNmExYzBmMjM1OTczNDdlNGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTYyPGJyPmxhdDotODY8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyZTk1YjY1NGExZTQ5Y2RhODIzMmEyNjc2YWMzNTYzLnNldENvbnRlbnQoaHRtbF84ZDNmYWVjZTE4ZmY0N2E2YTFjMGYyMzU5NzM0N2U0Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFhNTVlNDI1YTA1MDQ0N2Q4ZGUwZTQ0MmM4MTE5NDI1LmJpbmRQb3B1cChwb3B1cF9hMmU5NWI2NTRhMWU0OWNkYTgyMzJhMjY3NmFjMzU2Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yYzFmYzU0YTlkZTU0NTk3OGE1ZmU4YmI5ZGRjNDkyNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00LCAyN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMmFiNzBkZmY5ZDU0YmQwODIwMjM5ZGQ0ODNkMjE0NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMzRiM2RmNGZhYjM0YjFlYmZhM2NhZTRhZGVkNzBhOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjM0YjNkZjRmYWIzNGIxZWJmYTNjYWU0YWRlZDcwYTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoyNzxicj5sYXQ6LTQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyYWI3MGRmZjlkNTRiZDA4MjAyMzlkZDQ4M2QyMTQ2LnNldENvbnRlbnQoaHRtbF8yMzRiM2RmNGZhYjM0YjFlYmZhM2NhZTRhZGVkNzBhOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzJjMWZjNTRhOWRlNTQ1OTc4YTVmZThiYjlkZGM0OTI2LmJpbmRQb3B1cChwb3B1cF9hMmFiNzBkZmY5ZDU0YmQwODIwMjM5ZGQ0ODNkMjE0Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83NGJlMThmYjczN2U0OTFjOWM3YTRjNTAyNTJmZWNhMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLCAtMTBdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2IxYTEyZmM1NGE1NGJiYzg1MmU4ODBmNmE4MWMxMTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjgzOGYwYWQzZmIyNGEzYjgzYzczZWM0ZWJlODNjZjIgPSAkKCc8ZGl2IGlkPSJodG1sX2I4MzhmMGFkM2ZiMjRhM2I4M2M3M2VjNGViZTgzY2YyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTEwPGJyPmxhdDo1MDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2IxYTEyZmM1NGE1NGJiYzg1MmU4ODBmNmE4MWMxMTkuc2V0Q29udGVudChodG1sX2I4MzhmMGFkM2ZiMjRhM2I4M2M3M2VjNGViZTgzY2YyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzRiZTE4ZmI3MzdlNDkxYzljN2E0YzUwMjUyZmVjYTIuYmluZFBvcHVwKHBvcHVwXzdiMWExMmZjNTRhNTRiYmM4NTJlODgwZjZhODFjMTE5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2NmZmY0MzYwYmZmZTRjZDQ4OWJiYTFhNDllNWNhZWI5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTc1LCAtMjFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTE1ZGI2NzU5ODA0NDA0ZWFhOWEwNDFmYWUxN2Y3N2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzBkZjc3MjYyOTc3NGU4YjlhOTExMzA2ZTYxYjE0YjAgPSAkKCc8ZGl2IGlkPSJodG1sX2MwZGY3NzI2Mjk3NzRlOGI5YTkxMTMwNmU2MWIxNGIwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTIxPGJyPmxhdDotNzU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkxNWRiNjc1OTgwNDQwNGVhYTlhMDQxZmFlMTdmNzdkLnNldENvbnRlbnQoaHRtbF9jMGRmNzcyNjI5Nzc0ZThiOWE5MTEzMDZlNjFiMTRiMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NmZmY0MzYwYmZmZTRjZDQ4OWJiYTFhNDllNWNhZWI5LmJpbmRQb3B1cChwb3B1cF85MTVkYjY3NTk4MDQ0MDRlYWE5YTA0MWZhZTE3Zjc3ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xZGQ4ZTU0NDcwOTI0NDUzODJhYTliNzQ2NDMwZmU4MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy04MywgLTE1MF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYzEwY2ZmNzljYjY0NWNiOTA3MDAzMGQxNzg4ZmJmMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iOWE3YWEyNTRhMDM0ODAyYjVmNzlkODMwNTllMTI1MiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjlhN2FhMjU0YTAzNDgwMmI1Zjc5ZDgzMDU5ZTEyNTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTUwPGJyPmxhdDotODM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBjMTBjZmY3OWNiNjQ1Y2I5MDcwMDMwZDE3ODhmYmYxLnNldENvbnRlbnQoaHRtbF9iOWE3YWEyNTRhMDM0ODAyYjVmNzlkODMwNTllMTI1Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFkZDhlNTQ0NzA5MjQ0NTM4MmFhOWI3NDY0MzBmZTgzLmJpbmRQb3B1cChwb3B1cF8wYzEwY2ZmNzljYjY0NWNiOTA3MDAzMGQxNzg4ZmJmMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lZjRkMDAwMGYxZjE0NDYwYTFlZGQ0YzRhNTIxNzdiMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU4LCAtNTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzBlNDEzMGZhYzJiNDg2OGEwYmUxNTE3NDMzNmMwYjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjRmOTlkMzgxZGM2NDA2ZTgwMDJjZWMxYzgzYjAxNDAgPSAkKCc8ZGl2IGlkPSJodG1sXzI0Zjk5ZDM4MWRjNjQwNmU4MDAyY2VjMWM4M2IwMTQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTU5PGJyPmxhdDo1ODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzBlNDEzMGZhYzJiNDg2OGEwYmUxNTE3NDMzNmMwYjYuc2V0Q29udGVudChodG1sXzI0Zjk5ZDM4MWRjNjQwNmU4MDAyY2VjMWM4M2IwMTQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWY0ZDAwMDBmMWYxNDQ2MGExZWRkNGM0YTUyMTc3YjEuYmluZFBvcHVwKHBvcHVwXzcwZTQxMzBmYWMyYjQ4NjhhMGJlMTUxNzQzMzZjMGI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzJjODYxMDhlOWU4MDQxZjU5ZDczNzIzNGY5Zjc3MTQ0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMjYsIDY5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNhYTYxYWY2MzNhNDQ5ZjFiM2JkNTI4NGJmODkxYWY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ1MDQzY2JmNjUxZDRmODA4YjYwMzAwMmI3YWFhZDFhID0gJCgnPGRpdiBpZD0iaHRtbF80NTA0M2NiZjY1MWQ0ZjgwOGI2MDMwMDJiN2FhYWQxYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjY5PGJyPmxhdDoyNjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2FhNjFhZjYzM2E0NDlmMWIzYmQ1Mjg0YmY4OTFhZjQuc2V0Q29udGVudChodG1sXzQ1MDQzY2JmNjUxZDRmODA4YjYwMzAwMmI3YWFhZDFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmM4NjEwOGU5ZTgwNDFmNTlkNzM3MjM0ZjlmNzcxNDQuYmluZFBvcHVwKHBvcHVwXzNhYTYxYWY2MzNhNDQ5ZjFiM2JkNTI4NGJmODkxYWY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzM2MTA1MTE0NWI2YTQ0OTFiNjRhYTU5MTg0MWY4MDUwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbODQsIC0yN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NTFlNmFjNTc2YWY0NGUyODUzMmMzMDAyM2EzMGNlZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NzcyYjQ4M2Q5ZTg0YjE4OGE2ZDY3OGU1YmVkZDVjYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzc3MmI0ODNkOWU4NGIxODhhNmQ2NzhlNWJlZGQ1Y2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMjc8YnI+bGF0Ojg0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NTFlNmFjNTc2YWY0NGUyODUzMmMzMDAyM2EzMGNlZS5zZXRDb250ZW50KGh0bWxfNzc3MmI0ODNkOWU4NGIxODhhNmQ2NzhlNWJlZGQ1Y2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zNjEwNTExNDViNmE0NDkxYjY0YWE1OTE4NDFmODA1MC5iaW5kUG9wdXAocG9wdXBfOTUxZTZhYzU3NmFmNDRlMjg1MzJjMzAwMjNhMzBjZWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDQzZDI3OWE3Nzg3NGU2ZDhkMGI1MmJhNzBlOTVkNDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3NywgLTEyNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMDIxNjgyZTIyMzQ0YTA4OTRkYWUxNTZkMTJkZDhjYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MGM4ZmJhNjY0Y2M0NzQ0YWI3YjY0Mjc4MmNmZmU3YiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjBjOGZiYTY2NGNjNDc0NGFiN2I2NDI3ODJjZmZlN2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTI1PGJyPmxhdDo3NzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTAyMTY4MmUyMjM0NGEwODk0ZGFlMTU2ZDEyZGQ4Y2Muc2V0Q29udGVudChodG1sXzYwYzhmYmE2NjRjYzQ3NDRhYjdiNjQyNzgyY2ZmZTdiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDQzZDI3OWE3Nzg3NGU2ZDhkMGI1MmJhNzBlOTVkNDYuYmluZFBvcHVwKHBvcHVwXzEwMjE2ODJlMjIzNDRhMDg5NGRhZTE1NmQxMmRkOGNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzA2YmRkOTQwMDY5MzQ4Nzk4ZDY0NWVlYWFhMGUyYmViID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LCAtNjldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDgyNmQyN2I3ODBmNDI0MzlkMTczMGI3MGE0ZTllZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjg2YTlmZTczNzRiNGVjOWE1MmNkZGZkYjExZmEzYWEgPSAkKCc8ZGl2IGlkPSJodG1sX2Y4NmE5ZmU3Mzc0YjRlYzlhNTJjZGRmZGIxMWZhM2FhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTY5PGJyPmxhdDotMTk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA4MjZkMjdiNzgwZjQyNDM5ZDE3MzBiNzBhNGU5ZWRhLnNldENvbnRlbnQoaHRtbF9mODZhOWZlNzM3NGI0ZWM5YTUyY2RkZmRiMTFmYTNhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA2YmRkOTQwMDY5MzQ4Nzk4ZDY0NWVlYWFhMGUyYmViLmJpbmRQb3B1cChwb3B1cF8wODI2ZDI3Yjc4MGY0MjQzOWQxNzMwYjcwYTRlOWVkYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iYmZmMTk4OGM1NjQ0ODE2OTIwZGVkOTllYjQ1MWNmMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ2LCAxNDddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODQwNzdkNjc5ZGYwNGMwYWE2MjI4ZGUxODllYTVhMjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjRjZDg2NTUyYzQ2NGM5MDg4ZTY4ZmU0YmIyYzUxZjggPSAkKCc8ZGl2IGlkPSJodG1sX2Y0Y2Q4NjU1MmM0NjRjOTA4OGU2OGZlNGJiMmM1MWY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTQ3PGJyPmxhdDo0NjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODQwNzdkNjc5ZGYwNGMwYWE2MjI4ZGUxODllYTVhMjYuc2V0Q29udGVudChodG1sX2Y0Y2Q4NjU1MmM0NjRjOTA4OGU2OGZlNGJiMmM1MWY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYmJmZjE5ODhjNTY0NDgxNjkyMGRlZDk5ZWI0NTFjZjIuYmluZFBvcHVwKHBvcHVwXzg0MDc3ZDY3OWRmMDRjMGFhNjIyOGRlMTg5ZWE1YTI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI2N2RjMDllMjk4NDQ5MjBiMzVmOTg1NjFiY2M3YmYxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTc0LCA4OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MjMwZDVhNDcyZDQ0YmNlOTQwZTdkNWVjMTYxNWU5YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYjYzMGYxZmI5ZjU0Y2JhOWM2ODFlZjhlYjQwMzRkOSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2I2MzBmMWZiOWY1NGNiYTljNjgxZWY4ZWI0MDM0ZDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjo4ODxicj5sYXQ6LTc0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MjMwZDVhNDcyZDQ0YmNlOTQwZTdkNWVjMTYxNWU5Yi5zZXRDb250ZW50KGh0bWxfM2I2MzBmMWZiOWY1NGNiYTljNjgxZWY4ZWI0MDM0ZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yNjdkYzA5ZTI5ODQ0OTIwYjM1Zjk4NTYxYmNjN2JmMS5iaW5kUG9wdXAocG9wdXBfODIzMGQ1YTQ3MmQ0NGJjZTk0MGU3ZDVlYzE2MTVlOWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWI4ZjAyNWRjZWRiNDdmMGEyODQxOWUxMzAwODdhNzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjMsIC0xNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMTMxOGNmZjZhZDA0NzM1OTRjMDVjYmY4YzM3YjRkNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ODgyMDI4ZjY3MDE0YjY1OTkzNGI4NjY0NzU5MDIyNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjg4MjAyOGY2NzAxNGI2NTk5MzRiODY2NDc1OTAyMjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTU8YnI+bGF0Oi0yMzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzEzMThjZmY2YWQwNDczNTk0YzA1Y2JmOGMzN2I0ZDYuc2V0Q29udGVudChodG1sXzY4ODIwMjhmNjcwMTRiNjU5OTM0Yjg2NjQ3NTkwMjI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWI4ZjAyNWRjZWRiNDdmMGEyODQxOWUxMzAwODdhNzUuYmluZFBvcHVwKHBvcHVwXzMxMzE4Y2ZmNmFkMDQ3MzU5NGMwNWNiZjhjMzdiNGQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzZlMzBmYmNiYmU4ZjQwMzE4ZTUyMDE4ZGQzNTQzZjAyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEsIC04NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NjI3ZjkxYjljM2Y0MThiOTZkYTViZGNjMmZmYTFlNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83Njk5NDBiZDE3NjQ0NGEyYjk2NWQ5MWM1YzYzNjBlZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzY5OTQwYmQxNzY0NDRhMmI5NjVkOTFjNWM2MzYwZWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotODU8YnI+bGF0OjQxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NjI3ZjkxYjljM2Y0MThiOTZkYTViZGNjMmZmYTFlNC5zZXRDb250ZW50KGh0bWxfNzY5OTQwYmQxNzY0NDRhMmI5NjVkOTFjNWM2MzYwZWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82ZTMwZmJjYmJlOGY0MDMxOGU1MjAxOGRkMzU0M2YwMi5iaW5kUG9wdXAocG9wdXBfNzYyN2Y5MWI5YzNmNDE4Yjk2ZGE1YmRjYzJmZmExZTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWZiMTkwZjVmZWE4NGI3NzgyYjY2MjA0MGExZDI3MjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMzYsIC0xMzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjRhMWM2N2JkNjFjNDJjMzg0N2Y4MWZiMzJlOTdhZjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjNlMDY4OTgwNTc3NGY5NTlkZjZhNzAxYjNlNGQwODMgPSAkKCc8ZGl2IGlkPSJodG1sX2YzZTA2ODk4MDU3NzRmOTU5ZGY2YTcwMWIzZTRkMDgzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTEzOTxicj5sYXQ6LTM2PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNGExYzY3YmQ2MWM0MmMzODQ3ZjgxZmIzMmU5N2FmMC5zZXRDb250ZW50KGh0bWxfZjNlMDY4OTgwNTc3NGY5NTlkZjZhNzAxYjNlNGQwODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lZmIxOTBmNWZlYTg0Yjc3ODJiNjYyMDQwYTFkMjcyNi5iaW5kUG9wdXAocG9wdXBfYjRhMWM2N2JkNjFjNDJjMzg0N2Y4MWZiMzJlOTdhZjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2EyYjM0ZjI0MWMwNDhkMGI1YmQ5OTkwOWVlYWFkYTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs4OSwgMTczXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEwYzFmNjA2YzRkODQ0MTdhYTg1YWI3NGM0MTA2MGZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZkNzNlZjRjMzc4NDQxNDY4ZWI2OGY5N2NmNjM1Yjc3ID0gJCgnPGRpdiBpZD0iaHRtbF9mZDczZWY0YzM3ODQ0MTQ2OGViNjhmOTdjZjYzNWI3NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE3Mzxicj5sYXQ6ODk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwYzFmNjA2YzRkODQ0MTdhYTg1YWI3NGM0MTA2MGZjLnNldENvbnRlbnQoaHRtbF9mZDczZWY0YzM3ODQ0MTQ2OGViNjhmOTdjZjYzNWI3Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdhMmIzNGYyNDFjMDQ4ZDBiNWJkOTk5MDllZWFhZGE5LmJpbmRQb3B1cChwb3B1cF8xMGMxZjYwNmM0ZDg0NDE3YWE4NWFiNzRjNDEwNjBmYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wNGNhZjkxMjg5M2M0OTVhYjU4ZTNkMTUwNzdhNTQ2MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU3LCAtOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZTY3MTA1ZWEwYjQ0ZWZhOTIzMTgzNjU2NzdkMWI1MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YjFjZDQ0MjdkMzQ0MzMxOGQ0NzhlN2UxNGNhZTMwMSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWIxY2Q0NDI3ZDM0NDMzMThkNDc4ZTdlMTRjYWUzMDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotOTxicj5sYXQ6NTc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlNjcxMDVlYTBiNDRlZmE5MjMxODM2NTY3N2QxYjUwLnNldENvbnRlbnQoaHRtbF85YjFjZDQ0MjdkMzQ0MzMxOGQ0NzhlN2UxNGNhZTMwMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA0Y2FmOTEyODkzYzQ5NWFiNThlM2QxNTA3N2E1NDYwLmJpbmRQb3B1cChwb3B1cF9iZTY3MTA1ZWEwYjQ0ZWZhOTIzMTgzNjU2NzdkMWI1MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wODMwMmM5MmY0NTg0OTI4YWRhNjgyNmQ4MDQzZDdiZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0zNywgLTE0Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNmNmNjJlMDFlYzM0OTAxOTQ2YjhiYjlmOGUxZjE0ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wODI1OWJkNWU1Mzc0MGM5ODM0OWE4ZjQ1NDk0MGNiMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDgyNTliZDVlNTM3NDBjOTgzNDlhOGY0NTQ5NDBjYjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTQyPGJyPmxhdDotMzc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q2Y2Y2MmUwMWVjMzQ5MDE5NDZiOGJiOWY4ZTFmMTRmLnNldENvbnRlbnQoaHRtbF8wODI1OWJkNWU1Mzc0MGM5ODM0OWE4ZjQ1NDk0MGNiMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA4MzAyYzkyZjQ1ODQ5MjhhZGE2ODI2ZDgwNDNkN2JmLmJpbmRQb3B1cChwb3B1cF9kNmNmNjJlMDFlYzM0OTAxOTQ2YjhiYjlmOGUxZjE0Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81ODZmNWQ1MGY5ZTg0ODhkYjg5NmEwMzdhNDc0ODU1YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ1LCAxNDhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjY2YWI5ZDYxOTE0NDk4NDgwYjA1YTgzYTAwYWExMWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTYxNzFmZDRiN2E1NGI5NThmNjU0YjliNjJkNDZkNzQgPSAkKCc8ZGl2IGlkPSJodG1sXzE2MTcxZmQ0YjdhNTRiOTU4ZjY1NGI5YjYyZDQ2ZDc0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTQ4PGJyPmxhdDo0NTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjY2YWI5ZDYxOTE0NDk4NDgwYjA1YTgzYTAwYWExMWIuc2V0Q29udGVudChodG1sXzE2MTcxZmQ0YjdhNTRiOTU4ZjY1NGI5YjYyZDQ2ZDc0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTg2ZjVkNTBmOWU4NDg4ZGI4OTZhMDM3YTQ3NDg1NWMuYmluZFBvcHVwKHBvcHVwX2I2NmFiOWQ2MTkxNDQ5ODQ4MGIwNWE4M2EwMGFhMTFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzRjNTMyYjM3Mjg0YTRlZDZhODljZjMyZmZiYjUzOWI5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMjUsIC02Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYjk5YTFhMmZjMDk0MDYzOTFjODkxYWFjNGU3M2Q3YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZTk5NWMwOTM0NTg0MDlmOWY3NWViNzk5ZmExODU3YyA9ICQoJzxkaXYgaWQ9Imh0bWxfNmU5OTVjMDkzNDU4NDA5ZjlmNzVlYjc5OWZhMTg1N2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotNjY8YnI+bGF0OjI1PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYjk5YTFhMmZjMDk0MDYzOTFjODkxYWFjNGU3M2Q3Yi5zZXRDb250ZW50KGh0bWxfNmU5OTVjMDkzNDU4NDA5ZjlmNzVlYjc5OWZhMTg1N2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80YzUzMmIzNzI4NGE0ZWQ2YTg5Y2YzMmZmYmI1MzliOS5iaW5kUG9wdXAocG9wdXBfYWI5OWExYTJmYzA5NDA2MzkxYzg5MWFhYzRlNzNkN2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjdlOTdkZTUzMGY1NDE0OThmZGQ0ZWNkYTlkYzRiNWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MCwgMTQ4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y2OWViOGIxMzY1MDRmNTY5MzM0ZjIzZTlmNjg3MjQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZjNDBkYTdjMzdmNDRiODhhZTgzZWI0MzlmZGY4MzlmID0gJCgnPGRpdiBpZD0iaHRtbF82YzQwZGE3YzM3ZjQ0Yjg4YWU4M2ViNDM5ZmRmODM5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE0ODxicj5sYXQ6NTA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y2OWViOGIxMzY1MDRmNTY5MzM0ZjIzZTlmNjg3MjQ5LnNldENvbnRlbnQoaHRtbF82YzQwZGE3YzM3ZjQ0Yjg4YWU4M2ViNDM5ZmRmODM5Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzI3ZTk3ZGU1MzBmNTQxNDk4ZmRkNGVjZGE5ZGM0YjVhLmJpbmRQb3B1cChwb3B1cF9mNjllYjhiMTM2NTA0ZjU2OTMzNGYyM2U5ZjY4NzI0OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83ZmY2NzZiZmI4YmU0NGIzYjRkY2NlZTc4ZTViYTYyNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00NywgLTE3M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMmZhNjg5OTUzZDU0NmVjYjI2OTRlMjVjNjFhN2M5MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMTliZmYzMWMyMDA0MzNhODc5ZjZlNTFlOWIyM2FmNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTE5YmZmMzFjMjAwNDMzYTg3OWY2ZTUxZTliMjNhZjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTczPGJyPmxhdDotNDc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIyZmE2ODk5NTNkNTQ2ZWNiMjY5NGUyNWM2MWE3YzkwLnNldENvbnRlbnQoaHRtbF9hMTliZmYzMWMyMDA0MzNhODc5ZjZlNTFlOWIyM2FmNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdmZjY3NmJmYjhiZTQ0YjNiNGRjY2VlNzhlNWJhNjI1LmJpbmRQb3B1cChwb3B1cF8yMmZhNjg5OTUzZDU0NmVjYjI2OTRlMjVjNjFhN2M5MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82ZjVjZmE5NzI3NGM0ZmY0OTAxYTM3ZjMzYjJkZmZkNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzI4LCAtMTU2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MzNzhjOTBmYjIzNDQ2OThiYWM2NGY4YTQxYmEzYzFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhlZWM0NGQ5YzIxMTRhZGZiYjk3NDc3NGYwNjNlMjAyID0gJCgnPGRpdiBpZD0iaHRtbF84ZWVjNDRkOWMyMTE0YWRmYmI5NzQ3NzRmMDYzZTIwMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xNTY8YnI+bGF0OjI4PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMzc4YzkwZmIyMzQ0Njk4YmFjNjRmOGE0MWJhM2MxYi5zZXRDb250ZW50KGh0bWxfOGVlYzQ0ZDljMjExNGFkZmJiOTc0Nzc0ZjA2M2UyMDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82ZjVjZmE5NzI3NGM0ZmY0OTAxYTM3ZjMzYjJkZmZkNi5iaW5kUG9wdXAocG9wdXBfYzM3OGM5MGZiMjM0NDY5OGJhYzY0ZjhhNDFiYTNjMWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTcxZTJkNzU5MGM2NDk4ODllMzlkYjIzNTc1OTI5ODYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTksIDEyMF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYTcyNDI1ZjYyYmE0NTg4OTA4NmRmNzRlNjk3NDhkYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNWNjMzczMGI2YWU0ZTg4ODc3ZTBkZmU4ZjhlMmExYiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjVjYzM3MzBiNmFlNGU4ODg3N2UwZGZlOGY4ZTJhMWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoxMjA8YnI+bGF0Oi0xOTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmE3MjQyNWY2MmJhNDU4ODkwODZkZjc0ZTY5NzQ4ZGMuc2V0Q29udGVudChodG1sX2I1Y2MzNzMwYjZhZTRlODg4NzdlMGRmZThmOGUyYTFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTcxZTJkNzU5MGM2NDk4ODllMzlkYjIzNTc1OTI5ODYuYmluZFBvcHVwKHBvcHVwXzJhNzI0MjVmNjJiYTQ1ODg5MDg2ZGY3NGU2OTc0OGRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzg0NzBmNDYwOWViOTQ1ZWE5YzM1YjUwMWQyZmQ2N2Y4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbODQsIC01NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MTA2MmI5NjhiMDM0YjI3OWQ1NDgwZTE3YjdhZWVmYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MmYzYmNlYWQ5ODY0OGE3ODMzZjI1NTM1NTZhYjYyMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDJmM2JjZWFkOTg2NDhhNzgzM2YyNTUzNTU2YWI2MjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotNTU8YnI+bGF0Ojg0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MTA2MmI5NjhiMDM0YjI3OWQ1NDgwZTE3YjdhZWVmYS5zZXRDb250ZW50KGh0bWxfNDJmM2JjZWFkOTg2NDhhNzgzM2YyNTUzNTU2YWI2MjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84NDcwZjQ2MDllYjk0NWVhOWMzNWI1MDFkMmZkNjdmOC5iaW5kUG9wdXAocG9wdXBfNTEwNjJiOTY4YjAzNGIyNzlkNTQ4MGUxN2I3YWVlZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWE2MGU1MzA1NGNlNGJhNzg2M2VjYzdjNWYxMTdkNzAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0NiwgMTA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3ZmU4NjM2MDk2MzRhMjZhOTllNmE5ZGQ0NTg3OWFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E4ZDI1NjI2OTg0YTQ5NmY4YWM0ODA1Mjk2MGQ5ZGZjID0gJCgnPGRpdiBpZD0iaHRtbF9hOGQyNTYyNjk4NGE0OTZmOGFjNDgwNTI5NjBkOWRmYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjEwNjxicj5sYXQ6NDY8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3ZmU4NjM2MDk2MzRhMjZhOTllNmE5ZGQ0NTg3OWFhLnNldENvbnRlbnQoaHRtbF9hOGQyNTYyNjk4NGE0OTZmOGFjNDgwNTI5NjBkOWRmYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzlhNjBlNTMwNTRjZTRiYTc4NjNlY2M3YzVmMTE3ZDcwLmJpbmRQb3B1cChwb3B1cF9kN2ZlODYzNjA5NjM0YTI2YTk5ZTZhOWRkNDU4NzlhYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85ZDgyYWMyNGY2YmM0MWJkOWFlZmZkNzNlYmZmY2ExZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xOCwgLTE3NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YjdmMjZhMmNmMDE0MWY4YTBmNzEzZGQ0NzcxZWFiMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNDI5OTNiMDRkYWY0MWJiYjI1M2VmYjVlZTkwZjk5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMzQyOTkzYjA0ZGFmNDFiYmIyNTNlZmI1ZWU5MGY5OTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTc1PGJyPmxhdDotMTg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzViN2YyNmEyY2YwMTQxZjhhMGY3MTNkZDQ3NzFlYWIxLnNldENvbnRlbnQoaHRtbF8zNDI5OTNiMDRkYWY0MWJiYjI1M2VmYjVlZTkwZjk5Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzlkODJhYzI0ZjZiYzQxYmQ5YWVmZmQ3M2ViZmZjYTFlLmJpbmRQb3B1cChwb3B1cF81YjdmMjZhMmNmMDE0MWY4YTBmNzEzZGQ0NzcxZWFiMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iMjFhYTY3OGQ2ZDk0ZDI3YWYxNzlmZDJiNTlhYTZlMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzY2LCAtMTUwXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkZDRkYjU4MjZlZTQ2M2U4YTA2NjIxYzFjNWZkZWI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM3MWIzNTljN2QyNjQ3YzdhNDdlOWIwZTA0MWMxNjE2ID0gJCgnPGRpdiBpZD0iaHRtbF8zNzFiMzU5YzdkMjY0N2M3YTQ3ZTliMGUwNDFjMTYxNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xNTA8YnI+bGF0OjY2PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZGQ0ZGI1ODI2ZWU0NjNlOGEwNjYyMWMxYzVmZGViOS5zZXRDb250ZW50KGh0bWxfMzcxYjM1OWM3ZDI2NDdjN2E0N2U5YjBlMDQxYzE2MTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iMjFhYTY3OGQ2ZDk0ZDI3YWYxNzlmZDJiNTlhYTZlMy5iaW5kUG9wdXAocG9wdXBfN2RkNGRiNTgyNmVlNDYzZThhMDY2MjFjMWM1ZmRlYjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjllZTE0N2Q2ZmY5NDMxM2JjOWFkZjFjMjRmNmMwYjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs4NSwgNDRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjk3ZjMwNGMzZDlmNGVmZTlmYzgxZDgwZjI5NTA5OGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmM0NjdjMTcwMzhkNDE1ZWI2NDkxMzdmNDg2NzU0MzAgPSAkKCc8ZGl2IGlkPSJodG1sXzZjNDY3YzE3MDM4ZDQxNWViNjQ5MTM3ZjQ4Njc1NDMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246NDQ8YnI+bGF0Ojg1PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yOTdmMzA0YzNkOWY0ZWZlOWZjODFkODBmMjk1MDk4YS5zZXRDb250ZW50KGh0bWxfNmM0NjdjMTcwMzhkNDE1ZWI2NDkxMzdmNDg2NzU0MzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yOWVlMTQ3ZDZmZjk0MzEzYmM5YWRmMWMyNGY2YzBiOC5iaW5kUG9wdXAocG9wdXBfMjk3ZjMwNGMzZDlmNGVmZTlmYzgxZDgwZjI5NTA5OGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGUyNmI2ZDljM2Q0NDM4ZTk5ODUwMjFhOGEwNmU2MzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2NiwgLTQ4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ExM2FkZDlmNTRkZjRkYWQ5ODJhZTgxODhiZGJkZDYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MzOWI4MTFkYmY4NzQwMGFhMjFlNTM2Y2NkNzJlN2Y3ID0gJCgnPGRpdiBpZD0iaHRtbF9jMzliODExZGJmODc0MDBhYTIxZTUzNmNjZDcyZTdmNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi00ODxicj5sYXQ6NjY8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExM2FkZDlmNTRkZjRkYWQ5ODJhZTgxODhiZGJkZDYzLnNldENvbnRlbnQoaHRtbF9jMzliODExZGJmODc0MDBhYTIxZTUzNmNjZDcyZTdmNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBlMjZiNmQ5YzNkNDQzOGU5OTg1MDIxYThhMDZlNjM1LmJpbmRQb3B1cChwb3B1cF9hMTNhZGQ5ZjU0ZGY0ZGFkOTgyYWU4MTg4YmRiZGQ2Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80YzkyMTJjMWE0Mjg0YTU4ODExYTM5NDViYzEzMGY0MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy02LCAxNzFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzQyNTE0YWNjM2IwNDljYmI2NDU4ZWRiNGFiY2VlMGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDI2MjY1ZDZkN2Y5NDVlZDkxODdhMmU5ZTkzODQ2NDUgPSAkKCc8ZGl2IGlkPSJodG1sX2QyNjI2NWQ2ZDdmOTQ1ZWQ5MTg3YTJlOWU5Mzg0NjQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTcxPGJyPmxhdDotNjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzQyNTE0YWNjM2IwNDljYmI2NDU4ZWRiNGFiY2VlMGMuc2V0Q29udGVudChodG1sX2QyNjI2NWQ2ZDdmOTQ1ZWQ5MTg3YTJlOWU5Mzg0NjQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGM5MjEyYzFhNDI4NGE1ODgxMWEzOTQ1YmMxMzBmNDMuYmluZFBvcHVwKHBvcHVwXzM0MjUxNGFjYzNiMDQ5Y2JiNjQ1OGVkYjRhYmNlZTBjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzIxYzhjYjcxNDg2YTQwOGM5OGFmOTdiM2Y3ZDNlODk2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTgxLCAxN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMDNiMjA0YjI0M2I0ZjkyODU2YWZmZGE4NzBhODgwZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYWY5N2FjM2MzOWM0ODczYjRiZmMwYWM3ZDIyMDVkNiA9ICQoJzxkaXYgaWQ9Imh0bWxfY2FmOTdhYzNjMzljNDg3M2I0YmZjMGFjN2QyMjA1ZDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoxNzxicj5sYXQ6LTgxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMDNiMjA0YjI0M2I0ZjkyODU2YWZmZGE4NzBhODgwZS5zZXRDb250ZW50KGh0bWxfY2FmOTdhYzNjMzljNDg3M2I0YmZjMGFjN2QyMjA1ZDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yMWM4Y2I3MTQ4NmE0MDhjOThhZjk3YjNmN2QzZTg5Ni5iaW5kUG9wdXAocG9wdXBfZDAzYjIwNGIyNDNiNGY5Mjg1NmFmZmRhODcwYTg4MGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWEwYjJkNTRlNDA3NDUyYTgwZDA2Y2VkYTRiMTRlOGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMzMsIDE1Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYTM1MmVmM2RkZjY0ZWU3YTAxNTFjNjAwZjI3MjM5MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MWY5MmZkOGZlNGY0ZTllYWFjNmMzNzBmZWE1NDNmYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTFmOTJmZDhmZTRmNGU5ZWFhYzZjMzcwZmVhNTQzZmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoxNTY8YnI+bGF0Oi0zMzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmEzNTJlZjNkZGY2NGVlN2EwMTUxYzYwMGYyNzIzOTIuc2V0Q29udGVudChodG1sXzUxZjkyZmQ4ZmU0ZjRlOWVhYWM2YzM3MGZlYTU0M2ZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWEwYjJkNTRlNDA3NDUyYTgwZDA2Y2VkYTRiMTRlOGEuYmluZFBvcHVwKHBvcHVwXzJhMzUyZWYzZGRmNjRlZTdhMDE1MWM2MDBmMjcyMzkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzM4OTNlNGM4YWJiYjRmNzVhODIyZjY3ZWVlMzIzZDI3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTgyLCAtNTRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODcyNWI5OTY3ZjlhNDc4NGEyYTQ5NDAwODk2N2Q3MDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmFhYTZjYmIyMTFlNDdmOThhZTc5MzRiMjE2ZDRlNzQgPSAkKCc8ZGl2IGlkPSJodG1sX2JhYWE2Y2JiMjExZTQ3Zjk4YWU3OTM0YjIxNmQ0ZTc0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTU0PGJyPmxhdDotODI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3MjViOTk2N2Y5YTQ3ODRhMmE0OTQwMDg5NjdkNzAyLnNldENvbnRlbnQoaHRtbF9iYWFhNmNiYjIxMWU0N2Y5OGFlNzkzNGIyMTZkNGU3NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzM4OTNlNGM4YWJiYjRmNzVhODIyZjY3ZWVlMzIzZDI3LmJpbmRQb3B1cChwb3B1cF84NzI1Yjk5NjdmOWE0Nzg0YTJhNDk0MDA4OTY3ZDcwMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMGNjY2JiNGFkM2E0ODc5YTRhMzUzNGY5ZjNjZjRlNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ4LCAxMDVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzIyNjcyMTg0ZTkwNGVkMzllNDA3NGZhNGM2MGQyM2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWUxYzNiNjE0NWI3NGY5M2ExNTc3MDU1YWFhNzdiMjcgPSAkKCc8ZGl2IGlkPSJodG1sXzllMWMzYjYxNDViNzRmOTNhMTU3NzA1NWFhYTc3YjI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTA1PGJyPmxhdDo0ODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzIyNjcyMTg0ZTkwNGVkMzllNDA3NGZhNGM2MGQyM2Euc2V0Q29udGVudChodG1sXzllMWMzYjYxNDViNzRmOTNhMTU3NzA1NWFhYTc3YjI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzBjY2NiYjRhZDNhNDg3OWE0YTM1MzRmOWYzY2Y0ZTUuYmluZFBvcHVwKHBvcHVwXzMyMjY3MjE4NGU5MDRlZDM5ZTQwNzRmYTRjNjBkMjNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzAyY2MwY2NlZTEzMDRiODhhZjBkNGJhMjY2NjU3ZjZmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTMyLCAtOTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmNjZDc2MjJiMDM4NDBiOGE2ZjUxZDYwYzRjMWRlZDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzM1OWMxY2M3M2Q0NGJjM2E1ZmIyNjUzODIwOGU2ZDcgPSAkKCc8ZGl2IGlkPSJodG1sXzMzNTljMWNjNzNkNDRiYzNhNWZiMjY1MzgyMDhlNmQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTkyPGJyPmxhdDotMzI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjY2Q3NjIyYjAzODQwYjhhNmY1MWQ2MGM0YzFkZWQ4LnNldENvbnRlbnQoaHRtbF8zMzU5YzFjYzczZDQ0YmMzYTVmYjI2NTM4MjA4ZTZkNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzAyY2MwY2NlZTEzMDRiODhhZjBkNGJhMjY2NjU3ZjZmLmJpbmRQb3B1cChwb3B1cF9mY2NkNzYyMmIwMzg0MGI4YTZmNTFkNjBjNGMxZGVkOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80NmJiYTZlNWQ0ZmU0ODMzOWZlNDI5MDY5MmY3MGQwOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy04MywgLTIwXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzAzY2FiNDljNThjYjQxZTQ4ZjMyNTM5NWQzZjcxZmRlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MyZmUxY2IwMGE3NTQwZjg5ZmU0YzM1MzYyZjI2NDRkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIwNWNlMzlhZWRlZjQwNjViMDJiOTgzYmRmZDVjOTU5ID0gJCgnPGRpdiBpZD0iaHRtbF8yMDVjZTM5YWVkZWY0MDY1YjAyYjk4M2JkZmQ1Yzk1OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0yMDxicj5sYXQ6LTgzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMmZlMWNiMDBhNzU0MGY4OWZlNGMzNTM2MmYyNjQ0ZC5zZXRDb250ZW50KGh0bWxfMjA1Y2UzOWFlZGVmNDA2NWIwMmI5ODNiZGZkNWM5NTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80NmJiYTZlNWQ0ZmU0ODMzOWZlNDI5MDY5MmY3MGQwOC5iaW5kUG9wdXAocG9wdXBfYzJmZTFjYjAwYTc1NDBmODlmZTRjMzUzNjJmMjY0NGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGM3MmY3NTMyNzNkNGY1ZTg5YTgyNGMwZmJlNzAzMzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1LCAxNjZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTNmNTU3M2E4ZDg5NDRhMzkwZWJmMTc0NmNkMjAxMWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODA3MjBjYWIwNjQ5NGFkOGI1MGU3ZTc5ODhiY2U3MzggPSAkKCc8ZGl2IGlkPSJodG1sXzgwNzIwY2FiMDY0OTRhZDhiNTBlN2U3OTg4YmNlNzM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTY2PGJyPmxhdDo1PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85M2Y1NTczYThkODk0NGEzOTBlYmYxNzQ2Y2QyMDExZi5zZXRDb250ZW50KGh0bWxfODA3MjBjYWIwNjQ5NGFkOGI1MGU3ZTc5ODhiY2U3MzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wYzcyZjc1MzI3M2Q0ZjVlODlhODI0YzBmYmU3MDMzOS5iaW5kUG9wdXAocG9wdXBfOTNmNTU3M2E4ZDg5NDRhMzkwZWJmMTc0NmNkMjAxMWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2NmY2U2NDY4ZDBkNDk2Mzk4Y2FkMTc0MjhjYTFjMWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNDMsIC0xNzhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODhkNTcyMDM4MjM4NGQyZjk1NDk4ZjRiYTgwZDA0MDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZThmNGMxN2YxNTVjNDVlNzkxNmQzZDBhMWVhY2Q0NzAgPSAkKCc8ZGl2IGlkPSJodG1sX2U4ZjRjMTdmMTU1YzQ1ZTc5MTZkM2QwYTFlYWNkNDcwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTE3ODxicj5sYXQ6LTQzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OGQ1NzIwMzgyMzg0ZDJmOTU0OThmNGJhODBkMDQwMi5zZXRDb250ZW50KGh0bWxfZThmNGMxN2YxNTVjNDVlNzkxNmQzZDBhMWVhY2Q0NzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zY2ZjZTY0NjhkMGQ0OTYzOThjYWQxNzQyOGNhMWMxZC5iaW5kUG9wdXAocG9wdXBfODhkNTcyMDM4MjM4NGQyZjk1NDk4ZjRiYTgwZDA0MDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGMwYzBjYTI5ODFmNDhhMTgxZDg3OTkyNjM5OWM1ZDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1NSwgNzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODhlZjY4MzVmZjZiNGJmNDliZWY5YjdjN2JlMzE1ZDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWZlNzU5M2FhN2QzNDJjNmIwMTgwMDc0MmI1MmU4MDEgPSAkKCc8ZGl2IGlkPSJodG1sX2FmZTc1OTNhYTdkMzQyYzZiMDE4MDA3NDJiNTJlODAxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246NzY8YnI+bGF0OjU1PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OGVmNjgzNWZmNmI0YmY0OWJlZjliN2M3YmUzMTVkNS5zZXRDb250ZW50KGh0bWxfYWZlNzU5M2FhN2QzNDJjNmIwMTgwMDc0MmI1MmU4MDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kYzBjMGNhMjk4MWY0OGExODFkODc5OTI2Mzk5YzVkOS5iaW5kUG9wdXAocG9wdXBfODhlZjY4MzVmZjZiNGJmNDliZWY5YjdjN2JlMzE1ZDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzRlNDFjZmI4OWFkNDQxZTk4ZjZiMjgwZGFmMjEzZjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjcsIC02M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8wM2NhYjQ5YzU4Y2I0MWU0OGYzMjUzOTVkM2Y3MWZkZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YjI1MmVmYTc3Yjg0ZjRhOThjMDMzZDA0MGJjZTQ2YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kODVlYmYzZjIwNTc0YjljOGNjYTZjZmIwYjFjM2MxMyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDg1ZWJmM2YyMDU3NGI5YzhjY2E2Y2ZiMGIxYzNjMTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotNjM8YnI+bGF0Oi0yNzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGIyNTJlZmE3N2I4NGY0YTk4YzAzM2QwNDBiY2U0NmIuc2V0Q29udGVudChodG1sX2Q4NWViZjNmMjA1NzRiOWM4Y2NhNmNmYjBiMWMzYzEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzRlNDFjZmI4OWFkNDQxZTk4ZjZiMjgwZGFmMjEzZjIuYmluZFBvcHVwKHBvcHVwXzhiMjUyZWZhNzdiODRmNGE5OGMwMzNkMDQwYmNlNDZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBsYXllcl9jb250cm9sX2IyZWI3YmU2NjFhMDQ5M2E5YzQ2MjFjY2Y5OTZlNzk1ID0gewogICAgICAgICAgICAgICAgYmFzZV9sYXllcnMgOiB7ICJjYXJ0b2RicG9zaXRyb24iIDogdGlsZV9sYXllcl84ZDM4NDQ4ZmVlNGY0YzAwOWEyMTMyM2RlNWNhZjNmYiwgfSwKICAgICAgICAgICAgICAgIG92ZXJsYXlzIDogeyAiMTAwMCBjbHVzdGVyZWQgaWNvbnMiIDogbWFya2VyX2NsdXN0ZXJfMDNjYWI0OWM1OGNiNDFlNDhmMzI1Mzk1ZDNmNzFmZGUsIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIEwuY29udHJvbC5sYXllcnMoCiAgICAgICAgICAgICAgICBsYXllcl9jb250cm9sX2IyZWI3YmU2NjFhMDQ5M2E5YzQ2MjFjY2Y5OTZlNzk1LmJhc2VfbGF5ZXJzLAogICAgICAgICAgICAgICAgbGF5ZXJfY29udHJvbF9iMmViN2JlNjYxYTA0OTNhOWM0NjIxY2NmOTk2ZTc5NS5vdmVybGF5cywKICAgICAgICAgICAgICAgIHtwb3NpdGlvbjogJ3RvcHJpZ2h0JywKICAgICAgICAgICAgICAgICBjb2xsYXBzZWQ6IHRydWUsCiAgICAgICAgICAgICAgICAgYXV0b1pJbmRleDogdHJ1ZQogICAgICAgICAgICAgICAgfSkuYWRkVG8obWFwXzA0NjhlYzlkMTBjOTQ0MWE4ZjEwODFkNWE3ZjA2ZDg3KTsKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7fb3192b9240>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from folium.plugins import MarkerCluster\n",
    "\n",
    "\n",
    "m = folium.Map(\n",
    "    location=[np.mean(lats), np.mean(lons)],\n",
    "    tiles='Cartodb Positron',\n",
    "    zoom_start=1\n",
    ")\n",
    "\n",
    "marker_cluster = MarkerCluster(\n",
    "    locations=locations, popups=popups,\n",
    "    name='1000 clustered icons',\n",
    "    overlay=True,\n",
    "    control=True,\n",
    "    icon_create_function=icon_create_function\n",
    ")\n",
    "\n",
    "marker_cluster.add_to(m)\n",
    "\n",
    "folium.LayerControl().add_to(m)\n",
    "\n",
    "m.save(os.path.join('results', '1000_MarkerCluster1.html'))\n",
    "\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Explicit loop allow for customization in the loop."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 2.01 s, sys: 14.9 ms, total: 2.02 s\n",
      "Wall time: 2.02 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "\n",
    "m = folium.Map(\n",
    "    location=[np.mean(lats), np.mean(lons)],\n",
    "    tiles='Cartodb Positron',\n",
    "    zoom_start=1\n",
    ")\n",
    "\n",
    "marker_cluster = MarkerCluster(\n",
    "    name='1000 clustered icons',\n",
    "    overlay=True,\n",
    "    control=False,\n",
    "    icon_create_function=None\n",
    ")\n",
    "\n",
    "for k in range(size):\n",
    "    location = lats[k], lons[k]\n",
    "    marker = folium.Marker(location=location)\n",
    "    popup = 'lon:{}<br>lat:{}'.format(location[1], location[0])\n",
    "    folium.Popup(popup).add_to(marker)\n",
    "    marker_cluster.add_child(marker)\n",
    "\n",
    "marker_cluster.add_to(m)\n",
    "\n",
    "folium.LayerControl().add_to(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2dpdC5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIiAvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfYWQ0MmRiYzdiNWRlNDc3MWFmNjhlYWIwOGNiZDdmOWMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4xLjAvTWFya2VyQ2x1c3Rlci5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9NYXJrZXJDbHVzdGVyLkRlZmF1bHQuY3NzIiAvPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2FkNDJkYmM3YjVkZTQ3NzFhZjY4ZWFiMDhjYmQ3ZjljIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9hZDQyZGJjN2I1ZGU0NzcxYWY2OGVhYjA4Y2JkN2Y5YyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9hZDQyZGJjN2I1ZGU0NzcxYWY2OGVhYjA4Y2JkN2Y5YycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbLTIuMTIsLTguNTVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfN2RmOGY5MzYwYTZjNDQ1NjlkMTkxYjc5OGM4YTkwNmUgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL2NhcnRvZGItYmFzZW1hcHMte3N9Lmdsb2JhbC5zc2wuZmFzdGx5Lm5ldC9saWdodF9hbGwve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hZDQyZGJjN2I1ZGU0NzcxYWY2OGVhYjA4Y2JkN2Y5Yyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5ID0gTC5tYXJrZXJDbHVzdGVyR3JvdXAoewogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBtYXBfYWQ0MmRiYzdiNWRlNDc3MWFmNjhlYWIwOGNiZDdmOWMuYWRkTGF5ZXIobWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84OTc0MjY3NGEyYjI0YzNkOWE5ZGNmNjA0YjUxYzI3ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xNywgLTg0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y3ZGQwNWU5OTE0YTRmMDU5MmZmNjI1MjM3MmIyMmQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2YWU1MDliZTc4YzQ4MzBiY2E0MzNhZTk5NDZiMjk4ID0gJCgnPGRpdiBpZD0iaHRtbF8yNmFlNTA5YmU3OGM0ODMwYmNhNDMzYWU5OTQ2YjI5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi04NDxicj5sYXQ6LTE3PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mN2RkMDVlOTkxNGE0ZjA1OTJmZjYyNTIzNzJiMjJkNC5zZXRDb250ZW50KGh0bWxfMjZhZTUwOWJlNzhjNDgzMGJjYTQzM2FlOTk0NmIyOTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84OTc0MjY3NGEyYjI0YzNkOWE5ZGNmNjA0YjUxYzI3ZS5iaW5kUG9wdXAocG9wdXBfZjdkZDA1ZTk5MTRhNGYwNTkyZmY2MjUyMzcyYjIyZDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzNmZDNhMjA3ODdmNGI5ZTkzMjRhNTA4MTgwM2I4MzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxMiwgLTE3M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZWVkZWFkMjNhZmE0ZGEzYmJiNTBkYzk5ZDI3ZGEwZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82OGFlNGFlOTQ5ZTk0ZDA0YWNjY2M0YjlmNDI1ZDIwYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjhhZTRhZTk0OWU5NGQwNGFjY2NjNGI5ZjQyNWQyMGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTczPGJyPmxhdDoxMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGVlZGVhZDIzYWZhNGRhM2JiYjUwZGM5OWQyN2RhMGQuc2V0Q29udGVudChodG1sXzY4YWU0YWU5NDllOTRkMDRhY2NjYzRiOWY0MjVkMjBiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzNmZDNhMjA3ODdmNGI5ZTkzMjRhNTA4MTgwM2I4MzkuYmluZFBvcHVwKHBvcHVwX2RlZWRlYWQyM2FmYTRkYTNiYmI1MGRjOTlkMjdkYTBkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Q1YzJhZGQ0MzM1NjQ4NGI4YjEzZDhhNzcxMzBhYWNkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTQ5LCAzMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MGZmNzNmZGY1N2M0YTJiOTkxYTNkN2ZiYTZjMzg0NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYzJhNzY0MDg3MmQ0MzFhOTM0MGNkM2M0MzExZjE1NSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2MyYTc2NDA4NzJkNDMxYTkzNDBjZDNjNDMxMWYxNTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjozMTxicj5sYXQ6LTQ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MGZmNzNmZGY1N2M0YTJiOTkxYTNkN2ZiYTZjMzg0Ni5zZXRDb250ZW50KGh0bWxfM2MyYTc2NDA4NzJkNDMxYTkzNDBjZDNjNDMxMWYxNTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kNWMyYWRkNDMzNTY0ODRiOGIxM2Q4YTc3MTMwYWFjZC5iaW5kUG9wdXAocG9wdXBfNTBmZjczZmRmNTdjNGEyYjk5MWEzZDdmYmE2YzM4NDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODEzZTk2YTkzNDc0NDY5ZGI3YmUwMGI5NTFjNDA2YzYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMzksIC0zOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xY2VjOThiNTVkOWE0NTQzOTRiYTU4MjJmYjQwYmVhYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZmM2OTRiYTYzZTk0NDMwOWM4ZWMwMTVmZjliYWRhYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmZjNjk0YmE2M2U5NDQzMDljOGVjMDE1ZmY5YmFkYWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMzk8YnI+bGF0Oi0zOTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWNlYzk4YjU1ZDlhNDU0Mzk0YmE1ODIyZmI0MGJlYWMuc2V0Q29udGVudChodG1sXzJmYzY5NGJhNjNlOTQ0MzA5YzhlYzAxNWZmOWJhZGFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODEzZTk2YTkzNDc0NDY5ZGI3YmUwMGI5NTFjNDA2YzYuYmluZFBvcHVwKHBvcHVwXzFjZWM5OGI1NWQ5YTQ1NDM5NGJhNTgyMmZiNDBiZWFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI5NDE4YTUzMzdlNzQxYTM4NjI1NTc0MzRkZjgzMGNiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTg0LCA2MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMTBkZDFhZjk0NmI0MzU5YmI4ODlmOGE2ZTNiZjkyNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jM2I3NzAwZDA5Yzc0NDE2ODcyYWE3Njg2YTBlMjQ1YyA9ICQoJzxkaXYgaWQ9Imh0bWxfYzNiNzcwMGQwOWM3NDQxNjg3MmFhNzY4NmEwZTI0NWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjo2MTxicj5sYXQ6LTg0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMTBkZDFhZjk0NmI0MzU5YmI4ODlmOGE2ZTNiZjkyNi5zZXRDb250ZW50KGh0bWxfYzNiNzcwMGQwOWM3NDQxNjg3MmFhNzY4NmEwZTI0NWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yOTQxOGE1MzM3ZTc0MWEzODYyNTU3NDM0ZGY4MzBjYi5iaW5kUG9wdXAocG9wdXBfMjEwZGQxYWY5NDZiNDM1OWJiODg5ZjhhNmUzYmY5MjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2QyZWZiYmQ0ZDRlNGE0NWI5YzUxYWI3ZjFiM2JkZWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNzUsIC0yM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MGFlMThlMjljOGM0YTlkYThkMDhhNjg0ZDY2NjM2NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZDQ3YjQ2OWY2NzU0YjZjODVjMGEwZjhkM2FkNzMzNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZmQ0N2I0NjlmNjc1NGI2Yzg1YzBhMGY4ZDNhZDczMzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMjM8YnI+bGF0Oi03NTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjBhZTE4ZTI5YzhjNGE5ZGE4ZDA4YTY4NGQ2NjYzNjUuc2V0Q29udGVudChodG1sX2ZkNDdiNDY5ZjY3NTRiNmM4NWMwYTBmOGQzYWQ3MzM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2QyZWZiYmQ0ZDRlNGE0NWI5YzUxYWI3ZjFiM2JkZWQuYmluZFBvcHVwKHBvcHVwXzYwYWUxOGUyOWM4YzRhOWRhOGQwOGE2ODRkNjY2MzY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2U3NTRjNWFhNWVhYjQ3ZDk4MjA4N2E0ZTFlODI4ZTk3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTMxLCAtMTMxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIyNTIyYmZiNDJlMjRlNmM4Mzg1OTY1MmU2MWZmYWFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M0NDY2NDIyNDU2ZDRhMzU5ODQ4OGUzZjI0MzhjNzdlID0gJCgnPGRpdiBpZD0iaHRtbF9jNDQ2NjQyMjQ1NmQ0YTM1OTg0ODhlM2YyNDM4Yzc3ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xMzE8YnI+bGF0Oi0zMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjI1MjJiZmI0MmUyNGU2YzgzODU5NjUyZTYxZmZhYWUuc2V0Q29udGVudChodG1sX2M0NDY2NDIyNDU2ZDRhMzU5ODQ4OGUzZjI0MzhjNzdlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTc1NGM1YWE1ZWFiNDdkOTgyMDg3YTRlMWU4MjhlOTcuYmluZFBvcHVwKHBvcHVwXzIyNTIyYmZiNDJlMjRlNmM4Mzg1OTY1MmU2MWZmYWFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzY0ZjEwZjU1MTQ0ZTQ3OTdiYjViYzFjN2EyOThmMjJmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTksIC0xMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTA4NmQ5M2Q1NGRkNGM3NmE0MzY0ZmJlNjQ4ZmVhZjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmVkOGQ0NTIyZjA1NDcxY2IzNzQwN2MwMjQyYjQwYTkgPSAkKCc8ZGl2IGlkPSJodG1sXzZlZDhkNDUyMmYwNTQ3MWNiMzc0MDdjMDI0MmI0MGE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTEwMTxicj5sYXQ6LTk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkwODZkOTNkNTRkZDRjNzZhNDM2NGZiZTY0OGZlYWYzLnNldENvbnRlbnQoaHRtbF82ZWQ4ZDQ1MjJmMDU0NzFjYjM3NDA3YzAyNDJiNDBhOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY0ZjEwZjU1MTQ0ZTQ3OTdiYjViYzFjN2EyOThmMjJmLmJpbmRQb3B1cChwb3B1cF85MDg2ZDkzZDU0ZGQ0Yzc2YTQzNjRmYmU2NDhmZWFmMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80ZDRmNzUyMDZkZTA0MTFiOWU4YWViZDQ2ZmFmMTYzZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0zOCwgMTY0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QzODAzOGI0OTc0MTQ5MzM4ZTA1NmQwZDQzODQyYjkzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YwM2E2MDg1NzZhMTQ0YjM4ODMwMjJmN2E5MDllN2VlID0gJCgnPGRpdiBpZD0iaHRtbF9mMDNhNjA4NTc2YTE0NGIzODgzMDIyZjdhOTA5ZTdlZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE2NDxicj5sYXQ6LTM4PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMzgwMzhiNDk3NDE0OTMzOGUwNTZkMGQ0Mzg0MmI5My5zZXRDb250ZW50KGh0bWxfZjAzYTYwODU3NmExNDRiMzg4MzAyMmY3YTkwOWU3ZWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80ZDRmNzUyMDZkZTA0MTFiOWU4YWViZDQ2ZmFmMTYzZS5iaW5kUG9wdXAocG9wdXBfZDM4MDM4YjQ5NzQxNDkzMzhlMDU2ZDBkNDM4NDJiOTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGM1YjdlYzkxNmRlNGFlM2EwZWFiM2RmMThlZTZlNmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNCwgMTY2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MwMWE3MzgxNWRhMzQ1ZDdhNjMzNjBiYWE0N2U3MDc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJmYzU1NTAwYTBlZTRjYjBhMTkxYmM2MDRmNzc1NTc2ID0gJCgnPGRpdiBpZD0iaHRtbF8yZmM1NTUwMGEwZWU0Y2IwYTE5MWJjNjA0Zjc3NTU3NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE2Njxicj5sYXQ6MzQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MwMWE3MzgxNWRhMzQ1ZDdhNjMzNjBiYWE0N2U3MDc2LnNldENvbnRlbnQoaHRtbF8yZmM1NTUwMGEwZWU0Y2IwYTE5MWJjNjA0Zjc3NTU3Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzhjNWI3ZWM5MTZkZTRhZTNhMGVhYjNkZjE4ZWU2ZTZkLmJpbmRQb3B1cChwb3B1cF9jMDFhNzM4MTVkYTM0NWQ3YTYzMzYwYmFhNDdlNzA3Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81MDQyYWZkYWU0NTE0MDA4YmZlZTM5OGRlYjJlNmYyYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzIyLCAxMzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDNhYjE0N2Q5ZGVjNGNiOWI2NGYxODIzYmNkMjU2OGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODA2YTdiOTIxZjU2NDAwZGIwZDMzMzdhNTU1MGUzZWMgPSAkKCc8ZGl2IGlkPSJodG1sXzgwNmE3YjkyMWY1NjQwMGRiMGQzMzM3YTU1NTBlM2VjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTM5PGJyPmxhdDoyMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDNhYjE0N2Q5ZGVjNGNiOWI2NGYxODIzYmNkMjU2OGYuc2V0Q29udGVudChodG1sXzgwNmE3YjkyMWY1NjQwMGRiMGQzMzM3YTU1NTBlM2VjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTA0MmFmZGFlNDUxNDAwOGJmZWUzOThkZWIyZTZmMmIuYmluZFBvcHVwKHBvcHVwX2QzYWIxNDdkOWRlYzRjYjliNjRmMTgyM2JjZDI1NjhmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2M4OTRkYjkxMTZlYTQ2ZWU5YjY3YjE4MDM3NmNhNGZjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTYxLCAtNzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZThkZWJiOWVjY2RkNDE2MTg2M2VkMGZhMzNmNjU4ZmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWRiNDhlODZjMjE3NGViMzhlYjAxYWRkMmQ4MjA4ZGYgPSAkKCc8ZGl2IGlkPSJodG1sXzFkYjQ4ZTg2YzIxNzRlYjM4ZWIwMWFkZDJkODIwOGRmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTc5PGJyPmxhdDotNjE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U4ZGViYjllY2NkZDQxNjE4NjNlZDBmYTMzZjY1OGZjLnNldENvbnRlbnQoaHRtbF8xZGI0OGU4NmMyMTc0ZWIzOGViMDFhZGQyZDgyMDhkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2M4OTRkYjkxMTZlYTQ2ZWU5YjY3YjE4MDM3NmNhNGZjLmJpbmRQb3B1cChwb3B1cF9lOGRlYmI5ZWNjZGQ0MTYxODYzZWQwZmEzM2Y2NThmYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xMjFiZWY4ODJmMmI0MjMwYmNjNzkwZWZkNDM2NjM3MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM0LCAtMTEzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZlZTEyMGVlMGJmODRhN2I4Mzg5NDExMGY3MTI1MjEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBlMTM0OWQ2NGExMDQ0MDk4YWJiNDY2ODI2M2ZlMjllID0gJCgnPGRpdiBpZD0iaHRtbF8wZTEzNDlkNjRhMTA0NDA5OGFiYjQ2NjgyNjNmZTI5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xMTM8YnI+bGF0OjM0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZWUxMjBlZTBiZjg0YTdiODM4OTQxMTBmNzEyNTIxMi5zZXRDb250ZW50KGh0bWxfMGUxMzQ5ZDY0YTEwNDQwOThhYmI0NjY4MjYzZmUyOWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xMjFiZWY4ODJmMmI0MjMwYmNjNzkwZWZkNDM2NjM3MS5iaW5kUG9wdXAocG9wdXBfZmVlMTIwZWUwYmY4NGE3YjgzODk0MTEwZjcxMjUyMTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2Y1MWEyYzE5NDM5NGJkOWIzOGQzYTYwODI2MjkxMzEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMiwgLTEyOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYjViMDE3MmNlNGQ0NjBiYTc0NjJlYmQ4ZjRiNjMxNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYjY3NjY3NzgwNTI0MjJiOTgzMTA4OTc0YmU3NzM1NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWI2NzY2Nzc4MDUyNDIyYjk4MzEwODk3NGJlNzczNTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTI5PGJyPmxhdDotMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGI1YjAxNzJjZTRkNDYwYmE3NDYyZWJkOGY0YjYzMTYuc2V0Q29udGVudChodG1sX2ViNjc2Njc3ODA1MjQyMmI5ODMxMDg5NzRiZTc3MzU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2Y1MWEyYzE5NDM5NGJkOWIzOGQzYTYwODI2MjkxMzEuYmluZFBvcHVwKHBvcHVwX2RiNWIwMTcyY2U0ZDQ2MGJhNzQ2MmViZDhmNGI2MzE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzYxNmY3MTBiZDc3ZDRhZGU4ODg5YjYxMTRkNTAyM2ExID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTQ4LCAtMTExXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IxMDhlNDkwODAwYzQ4ZjViNDg2NzdmMDBmYjQ3MTIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZlZDFmYmQ5MGY4YzQwYjg5YTkxNmZlYWZkZTZjZWRkID0gJCgnPGRpdiBpZD0iaHRtbF9mZWQxZmJkOTBmOGM0MGI4OWE5MTZmZWFmZGU2Y2VkZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xMTE8YnI+bGF0Oi00ODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjEwOGU0OTA4MDBjNDhmNWI0ODY3N2YwMGZiNDcxMjIuc2V0Q29udGVudChodG1sX2ZlZDFmYmQ5MGY4YzQwYjg5YTkxNmZlYWZkZTZjZWRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjE2ZjcxMGJkNzdkNGFkZTg4ODliNjExNGQ1MDIzYTEuYmluZFBvcHVwKHBvcHVwX2IxMDhlNDkwODAwYzQ4ZjViNDg2NzdmMDBmYjQ3MTIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzdlMTVjZDU4NTE3ODQ0MGU4MzQ5NWZmNTJiMDVmODk5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTgsIDEyMF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83YTBmZDg0YjI2MDQ0ZDU1OGI5MWI0NjUyODNkODdiMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82Y2Q1ZTU3NGZmN2E0OTY4YWFhMGY3MDQyMzQ4NDVlNyA9ICQoJzxkaXYgaWQ9Imh0bWxfNmNkNWU1NzRmZjdhNDk2OGFhYTBmNzA0MjM0ODQ1ZTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoxMjA8YnI+bGF0Oi04PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YTBmZDg0YjI2MDQ0ZDU1OGI5MWI0NjUyODNkODdiMC5zZXRDb250ZW50KGh0bWxfNmNkNWU1NzRmZjdhNDk2OGFhYTBmNzA0MjM0ODQ1ZTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83ZTE1Y2Q1ODUxNzg0NDBlODM0OTVmZjUyYjA1Zjg5OS5iaW5kUG9wdXAocG9wdXBfN2EwZmQ4NGIyNjA0NGQ1NThiOTFiNDY1MjgzZDg3YjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTYyNDgwZjc0ODU1NDU0N2I3YTQ2N2ZmMjFiMDAyOWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsyMSwgOTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmFhZTk2N2JkZWZjNGE4OGE5MmYyZTBkMGE0ZjAzOWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmRkYmVkYmMzZDFjNGI1YmI0MDE2Mzc3OGJlNTJiOWQgPSAkKCc8ZGl2IGlkPSJodG1sX2ZkZGJlZGJjM2QxYzRiNWJiNDAxNjM3NzhiZTUyYjlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246OTY8YnI+bGF0OjIxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YWFlOTY3YmRlZmM0YTg4YTkyZjJlMGQwYTRmMDM5YS5zZXRDb250ZW50KGh0bWxfZmRkYmVkYmMzZDFjNGI1YmI0MDE2Mzc3OGJlNTJiOWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hNjI0ODBmNzQ4NTU0NTQ3YjdhNDY3ZmYyMWIwMDI5Zi5iaW5kUG9wdXAocG9wdXBfNmFhZTk2N2JkZWZjNGE4OGE5MmYyZTBkMGE0ZjAzOWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjc5ODE4NGM4NWU1NDRiOTk0MzU1NTZmZmM3OGQ3MzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjAsIC0xMjldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWFlNGM2NTQyMGJlNGNjYWIzMmUwZDdhN2Q0MmQ5MmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2NhMjNkNmM3NWZkNDVlZGI0M2Y4YzZhZGIyMjExZTQgPSAkKCc8ZGl2IGlkPSJodG1sXzdjYTIzZDZjNzVmZDQ1ZWRiNDNmOGM2YWRiMjIxMWU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTEyOTxicj5sYXQ6LTIwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYWU0YzY1NDIwYmU0Y2NhYjMyZTBkN2E3ZDQyZDkyYS5zZXRDb250ZW50KGh0bWxfN2NhMjNkNmM3NWZkNDVlZGI0M2Y4YzZhZGIyMjExZTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yNzk4MTg0Yzg1ZTU0NGI5OTQzNTU1NmZmYzc4ZDczNS5iaW5kUG9wdXAocG9wdXBfZWFlNGM2NTQyMGJlNGNjYWIzMmUwZDdhN2Q0MmQ5MmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGZiZTRlYzU5ODQ2NDdkZGI0MmQ0OTQxNmRmNThjMmEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjQsIC0xMTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmY0YWI5MDIzOGM3NDgwMWEzM2UzYzgwMjMwY2IzYWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGU4Nzc4MzdlOTM2NGNiMGI0MjBkYzYwMTQzZTRlYWIgPSAkKCc8ZGl2IGlkPSJodG1sXzRlODc3ODM3ZTkzNjRjYjBiNDIwZGM2MDE0M2U0ZWFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTExMTxicj5sYXQ6LTI0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZjRhYjkwMjM4Yzc0ODAxYTMzZTNjODAyMzBjYjNhZS5zZXRDb250ZW50KGh0bWxfNGU4Nzc4MzdlOTM2NGNiMGI0MjBkYzYwMTQzZTRlYWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80ZmJlNGVjNTk4NDY0N2RkYjQyZDQ5NDE2ZGY1OGMyYS5iaW5kUG9wdXAocG9wdXBfZmY0YWI5MDIzOGM3NDgwMWEzM2UzYzgwMjMwY2IzYWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmNjOTUyYzAwZmVmNDI3Mzg2MDBkMjg4ZGYxMTIyODIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszMCwgLTE0N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NDIwNDFhNjI1MTg0YzcxYWRjNTk2NTc4NTAzZDZmMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYjM2NDlkMzQ0ZWM0MDhiYjIxZTc3MjAxM2ZiMmU1MiA9ICQoJzxkaXYgaWQ9Imh0bWxfMGIzNjQ5ZDM0NGVjNDA4YmIyMWU3NzIwMTNmYjJlNTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTQ3PGJyPmxhdDozMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDQyMDQxYTYyNTE4NGM3MWFkYzU5NjU3ODUwM2Q2ZjAuc2V0Q29udGVudChodG1sXzBiMzY0OWQzNDRlYzQwOGJiMjFlNzcyMDEzZmIyZTUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZmNjOTUyYzAwZmVmNDI3Mzg2MDBkMjg4ZGYxMTIyODIuYmluZFBvcHVwKHBvcHVwXzQ0MjA0MWE2MjUxODRjNzFhZGM1OTY1Nzg1MDNkNmYwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2IzYzlmOTJlY2YwODQwZWM5MzI2OTlmYWJjMjI4MTZkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIwLCA3Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYjk5NzA5ODVlNjY0ZWU2OTJhMWUxZTllOWE2MDhjZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMGRlYmU4YjI4NDk0NDNiODkzZjllMWIzOTFhZjM0ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTBkZWJlOGIyODQ5NDQzYjg5M2Y5ZTFiMzkxYWYzNGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjo3Njxicj5sYXQ6LTIwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYjk5NzA5ODVlNjY0ZWU2OTJhMWUxZTllOWE2MDhjZC5zZXRDb250ZW50KGh0bWxfYTBkZWJlOGIyODQ5NDQzYjg5M2Y5ZTFiMzkxYWYzNGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iM2M5ZjkyZWNmMDg0MGVjOTMyNjk5ZmFiYzIyODE2ZC5iaW5kUG9wdXAocG9wdXBfZmI5OTcwOTg1ZTY2NGVlNjkyYTFlMWU5ZTlhNjA4Y2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDg2OTlmMzU3ZDI1NDQxNmIxY2Q4Y2QyOTU2YmUzMzEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MSwgMTI5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg2ZDZiYzJjYmQ1NjQ3ZTliY2RmNDAzM2I2YjU3M2UzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRkNjdmYTYxZDcwODRkMmNiYmExZTJiOWQ3NDU1YmQ2ID0gJCgnPGRpdiBpZD0iaHRtbF80ZDY3ZmE2MWQ3MDg0ZDJjYmJhMWUyYjlkNzQ1NWJkNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjEyOTxicj5sYXQ6NDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg2ZDZiYzJjYmQ1NjQ3ZTliY2RmNDAzM2I2YjU3M2UzLnNldENvbnRlbnQoaHRtbF80ZDY3ZmE2MWQ3MDg0ZDJjYmJhMWUyYjlkNzQ1NWJkNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA4Njk5ZjM1N2QyNTQ0MTZiMWNkOGNkMjk1NmJlMzMxLmJpbmRQb3B1cChwb3B1cF84NmQ2YmMyY2JkNTY0N2U5YmNkZjQwMzNiNmI1NzNlMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hZmNhYWE0NTJmZWU0NTgxOTdjMGI2YTA0MWY5ZDBkMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xMCwgMTQ1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViYzFiNThhMTA1YjQwYjNhMGY1ZGM5YmI4ODYxM2VmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMwOWZjM2EwMDYxODQ5ZGZhYTU3MTNmYWU1MWRhNzllID0gJCgnPGRpdiBpZD0iaHRtbF8zMDlmYzNhMDA2MTg0OWRmYWE1NzEzZmFlNTFkYTc5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE0NTxicj5sYXQ6LTEwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYmMxYjU4YTEwNWI0MGIzYTBmNWRjOWJiODg2MTNlZi5zZXRDb250ZW50KGh0bWxfMzA5ZmMzYTAwNjE4NDlkZmFhNTcxM2ZhZTUxZGE3OWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hZmNhYWE0NTJmZWU0NTgxOTdjMGI2YTA0MWY5ZDBkMy5iaW5kUG9wdXAocG9wdXBfZWJjMWI1OGExMDViNDBiM2EwZjVkYzliYjg4NjEzZWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzgyNTVlOTM2MWMyNDIxNTkyZjYyNTU1YmJhOTI3ZGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNDksIC03OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNTZmOWJlNWE2OTM0MzNhYWY5MWMzNzIzZDMzYTNiMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMjc1OTJhYjEzMmE0YTI2YThiNTJlYzQ1MmVjMTFmZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTI3NTkyYWIxMzJhNGEyNmE4YjUyZWM0NTJlYzExZmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotNzk8YnI+bGF0Oi00OTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTU2ZjliZTVhNjkzNDMzYWFmOTFjMzcyM2QzM2EzYjMuc2V0Q29udGVudChodG1sX2EyNzU5MmFiMTMyYTRhMjZhOGI1MmVjNDUyZWMxMWZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzgyNTVlOTM2MWMyNDIxNTkyZjYyNTU1YmJhOTI3ZGEuYmluZFBvcHVwKHBvcHVwX2U1NmY5YmU1YTY5MzQzM2FhZjkxYzM3MjNkMzNhM2IzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzk0MmY0MGVjZDYxZDQ0ODBiZmNiNzY0NTBkNmVhNDQwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcsIC03MF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NGRlZmQ2NDY1NDY0MzRkYTFiZWVhN2M4ZWEwNzI3ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNTcyM2JkZWIzMjY0NTQxODI3Yjc5NzM2YWUzMDQwNCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTU3MjNiZGViMzI2NDU0MTgyN2I3OTczNmFlMzA0MDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotNzA8YnI+bGF0OjM3PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NGRlZmQ2NDY1NDY0MzRkYTFiZWVhN2M4ZWEwNzI3ZC5zZXRDb250ZW50KGh0bWxfZTU3MjNiZGViMzI2NDU0MTgyN2I3OTczNmFlMzA0MDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85NDJmNDBlY2Q2MWQ0NDgwYmZjYjc2NDUwZDZlYTQ0MC5iaW5kUG9wdXAocG9wdXBfNzRkZWZkNjQ2NTQ2NDM0ZGExYmVlYTdjOGVhMDcyN2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjFhZDRmZGQ1YjQ1NDFjOWI3YjRmYWI4Y2I1ODM4ZTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2NiwgMTQ4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhlZjAzMzBjYzIxNjRjYWVhOTc2M2E5YzM5YWIzNzkxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRlOGQzNTc3Y2I5MzRiYTJhNjA1MDliOTg2YWI4OWUyID0gJCgnPGRpdiBpZD0iaHRtbF80ZThkMzU3N2NiOTM0YmEyYTYwNTA5Yjk4NmFiODllMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE0ODxicj5sYXQ6NjY8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhlZjAzMzBjYzIxNjRjYWVhOTc2M2E5YzM5YWIzNzkxLnNldENvbnRlbnQoaHRtbF80ZThkMzU3N2NiOTM0YmEyYTYwNTA5Yjk4NmFiODllMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2IxYWQ0ZmRkNWI0NTQxYzliN2I0ZmFiOGNiNTgzOGUxLmJpbmRQb3B1cChwb3B1cF84ZWYwMzMwY2MyMTY0Y2FlYTk3NjNhOWMzOWFiMzc5MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82NDI4NjM5NmNhOTM0NWY1YjljYTFlMDdiNWY3YjViOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy04OCwgLTEwNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ODdlZDQxMDU1YmE0MDUxYmMzNzQzYjgxZjI2YWExYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMWY1OWJjNjQxYjM0NmExODhhODcxNDkwYWZmMDExZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTFmNTliYzY0MWIzNDZhMTg4YTg3MTQ5MGFmZjAxMWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTA0PGJyPmxhdDotODg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg4N2VkNDEwNTViYTQwNTFiYzM3NDNiODFmMjZhYTFiLnNldENvbnRlbnQoaHRtbF9lMWY1OWJjNjQxYjM0NmExODhhODcxNDkwYWZmMDExZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY0Mjg2Mzk2Y2E5MzQ1ZjViOWNhMWUwN2I1ZjdiNWI4LmJpbmRQb3B1cChwb3B1cF84ODdlZDQxMDU1YmE0MDUxYmMzNzQzYjgxZjI2YWExYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80ZTc2NDJiOTg5MWI0ZDIwYTM2ZGEzMzNmMDhiMTk2OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy01MSwgLTddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWQwMjZmM2RhZDQ5NDVhMWFhYTY3MjMwOWMxZmIxOGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjc5NTNhYTY1N2Y4NDY2MmJkYjZiMTU4ZWNiMWIwYmIgPSAkKCc8ZGl2IGlkPSJodG1sX2I3OTUzYWE2NTdmODQ2NjJiZGI2YjE1OGVjYjFiMGJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTc8YnI+bGF0Oi01MTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWQwMjZmM2RhZDQ5NDVhMWFhYTY3MjMwOWMxZmIxOGEuc2V0Q29udGVudChodG1sX2I3OTUzYWE2NTdmODQ2NjJiZGI2YjE1OGVjYjFiMGJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGU3NjQyYjk4OTFiNGQyMGEzNmRhMzMzZjA4YjE5NjguYmluZFBvcHVwKHBvcHVwX2VkMDI2ZjNkYWQ0OTQ1YTFhYWE2NzIzMDljMWZiMThhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhhODZmNmFjZjY5ZDQxMDA4NjRlMDM0OGI2NDk1MDUxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNjIsIDExOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZWVkN2M4NjcxMTc0NmY0YjAzOGVmNWU4M2I3OWRjZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MjU1M2FkMDhlMGY0MWJjODUyZTkwZWIzNjE0NzhkZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjI1NTNhZDA4ZTBmNDFiYzg1MmU5MGViMzYxNDc4ZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoxMTg8YnI+bGF0OjYyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZWVkN2M4NjcxMTc0NmY0YjAzOGVmNWU4M2I3OWRjZC5zZXRDb250ZW50KGh0bWxfNjI1NTNhZDA4ZTBmNDFiYzg1MmU5MGViMzYxNDc4ZGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84YTg2ZjZhY2Y2OWQ0MTAwODY0ZTAzNDhiNjQ5NTA1MS5iaW5kUG9wdXAocG9wdXBfYWVlZDdjODY3MTE3NDZmNGIwMzhlZjVlODNiNzlkY2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmEzYjhmOTYwNzE2NDVjNWJkZDA3ZWM4OTUwYzUxMzggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMzcsIDExN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMjFkYTgzZTA0ZDE0YWY2OWNiMzEyOTJhYTFkOTljYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMmE2Y2E5Zjk3ODI0N2Q5OWI1MWI0YTg1ZWQyN2Y2NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjJhNmNhOWY5NzgyNDdkOTliNTFiNGE4NWVkMjdmNjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoxMTc8YnI+bGF0Oi0zNzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTIxZGE4M2UwNGQxNGFmNjljYjMxMjkyYWExZDk5Y2Muc2V0Q29udGVudChodG1sX2YyYTZjYTlmOTc4MjQ3ZDk5YjUxYjRhODVlZDI3ZjY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZmEzYjhmOTYwNzE2NDVjNWJkZDA3ZWM4OTUwYzUxMzguYmluZFBvcHVwKHBvcHVwX2UyMWRhODNlMDRkMTRhZjY5Y2IzMTI5MmFhMWQ5OWNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2MzNTJlOGE1NmE1YTRhOTFiMWViYmEzMjhlOGIxYzYxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTY4LCAtODBdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTdlNzdhNTk5NTQyNDZlZjg3NGZjMTkyM2U3YzBkNjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzkwNWZhMjYxY2IwNDZkN2JjYTA2YWM2MDQ2NTBlYjYgPSAkKCc8ZGl2IGlkPSJodG1sX2M5MDVmYTI2MWNiMDQ2ZDdiY2EwNmFjNjA0NjUwZWI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTgwPGJyPmxhdDotNjg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E3ZTc3YTU5OTU0MjQ2ZWY4NzRmYzE5MjNlN2MwZDY0LnNldENvbnRlbnQoaHRtbF9jOTA1ZmEyNjFjYjA0NmQ3YmNhMDZhYzYwNDY1MGViNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2MzNTJlOGE1NmE1YTRhOTFiMWViYmEzMjhlOGIxYzYxLmJpbmRQb3B1cChwb3B1cF9hN2U3N2E1OTk1NDI0NmVmODc0ZmMxOTIzZTdjMGQ2NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81Nzc5ODk1YzFlOTE0M2EzODM2ZTkzODBjNjcyZGIwNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzY5LCAtMTI2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFmYmQxMzcxMGE3YjQwNGY4ZGYwZDdkZDRhNmFlZTdkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q4YjFjMDJiYmY2MzRhNjc4Mjk1YWNiYjU3Y2YwYTM2ID0gJCgnPGRpdiBpZD0iaHRtbF9kOGIxYzAyYmJmNjM0YTY3ODI5NWFjYmI1N2NmMGEzNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xMjY8YnI+bGF0OjY5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZmJkMTM3MTBhN2I0MDRmOGRmMGQ3ZGQ0YTZhZWU3ZC5zZXRDb250ZW50KGh0bWxfZDhiMWMwMmJiZjYzNGE2NzgyOTVhY2JiNTdjZjBhMzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81Nzc5ODk1YzFlOTE0M2EzODM2ZTkzODBjNjcyZGIwNC5iaW5kUG9wdXAocG9wdXBfMWZiZDEzNzEwYTdiNDA0ZjhkZjBkN2RkNGE2YWVlN2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTZjNDg0ZGM4NTQ3NDg0NGI2Njc4ZGYxZTAzOGI1ZDIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0LCAyN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YjE3NjQ0MGM1ZjU0YTY3YTBhYmY5MGRmZmQ0MzRlYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ODVhOTZhYzIwYzI0NjE3ODA0ZjEwOGU3NDcwYTc2OCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzg1YTk2YWMyMGMyNDYxNzgwNGYxMDhlNzQ3MGE3NjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoyNzxicj5sYXQ6NDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWIxNzY0NDBjNWY1NGE2N2EwYWJmOTBkZmZkNDM0ZWMuc2V0Q29udGVudChodG1sXzc4NWE5NmFjMjBjMjQ2MTc4MDRmMTA4ZTc0NzBhNzY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTZjNDg0ZGM4NTQ3NDg0NGI2Njc4ZGYxZTAzOGI1ZDIuYmluZFBvcHVwKHBvcHVwXzliMTc2NDQwYzVmNTRhNjdhMGFiZjkwZGZmZDQzNGVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2ZkMDI1NDVhOTBhZDQ4MWI4MTUzYzI5YzBhZWUyODhkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbODgsIDU0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZlNzAzODEyNTE4MDRiZjM5NGIyNDk3Yzg0OWUxZmE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg3NWI0ODM4MTYzNzQ2MmNhNjc1MTVlYjYzMTI2OGQ4ID0gJCgnPGRpdiBpZD0iaHRtbF84NzViNDgzODE2Mzc0NjJjYTY3NTE1ZWI2MzEyNjhkOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjU0PGJyPmxhdDo4ODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmU3MDM4MTI1MTgwNGJmMzk0YjI0OTdjODQ5ZTFmYTYuc2V0Q29udGVudChodG1sXzg3NWI0ODM4MTYzNzQ2MmNhNjc1MTVlYjYzMTI2OGQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZmQwMjU0NWE5MGFkNDgxYjgxNTNjMjljMGFlZTI4OGQuYmluZFBvcHVwKHBvcHVwXzZlNzAzODEyNTE4MDRiZjM5NGIyNDk3Yzg0OWUxZmE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2JlMzU5OTY3NTNlMTQ4NjQ5NDhjNWVlN2RkM2U4OGFlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTgsIDE3MF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNmNkMGFiY2UwNWI0NzQ5YWNmODk0OTU5YzM1ZjY2OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNTg2MGYxYTVjMmM0ZTQ4OGVlZGM3MzZkZjM2ZThkZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDU4NjBmMWE1YzJjNGU0ODhlZWRjNzM2ZGYzNmU4ZGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoxNzA8YnI+bGF0Oi04PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNmNkMGFiY2UwNWI0NzQ5YWNmODk0OTU5YzM1ZjY2OS5zZXRDb250ZW50KGh0bWxfMDU4NjBmMWE1YzJjNGU0ODhlZWRjNzM2ZGYzNmU4ZGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iZTM1OTk2NzUzZTE0ODY0OTQ4YzVlZTdkZDNlODhhZS5iaW5kUG9wdXAocG9wdXBfYTZjZDBhYmNlMDViNDc0OWFjZjg5NDk1OWMzNWY2NjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTkzZTA4NWRiZWFjNDRiNmFhYmI5ZmM2YzcwMjdhNzEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxOCwgMTc4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA2ZjQ4YWNkNDZjNzQyZjg4NDUwZDNmY2IzYzJmYzI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc2YmNmM2M0MDllNjQ4NmQ5NDQ4Mzc3NzQ1N2FkM2ZiID0gJCgnPGRpdiBpZD0iaHRtbF83NmJjZjNjNDA5ZTY0ODZkOTQ0ODM3Nzc0NTdhZDNmYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE3ODxicj5sYXQ6MTg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA2ZjQ4YWNkNDZjNzQyZjg4NDUwZDNmY2IzYzJmYzI3LnNldENvbnRlbnQoaHRtbF83NmJjZjNjNDA5ZTY0ODZkOTQ0ODM3Nzc0NTdhZDNmYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U5M2UwODVkYmVhYzQ0YjZhYWJiOWZjNmM3MDI3YTcxLmJpbmRQb3B1cChwb3B1cF8wNmY0OGFjZDQ2Yzc0MmY4ODQ1MGQzZmNiM2MyZmMyNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80MmYzYmE0MGJkM2U0OTZiODFmMjg3YmRlMzMxNzc5OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUzLCAtMTc0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmNGNkYWNiNGRiYjRiYmNiYTJkNTQ4YzQzMzdkZGFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgzZTkxNWUyNzRlYzRlNGRhMDIxZDE4OTJjNDdjZWIxID0gJCgnPGRpdiBpZD0iaHRtbF84M2U5MTVlMjc0ZWM0ZTRkYTAyMWQxODkyYzQ3Y2ViMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xNzQ8YnI+bGF0OjUzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZjRjZGFjYjRkYmI0YmJjYmEyZDU0OGM0MzM3ZGRhZS5zZXRDb250ZW50KGh0bWxfODNlOTE1ZTI3NGVjNGU0ZGEwMjFkMTg5MmM0N2NlYjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80MmYzYmE0MGJkM2U0OTZiODFmMjg3YmRlMzMxNzc5OC5iaW5kUG9wdXAocG9wdXBfYWY0Y2RhY2I0ZGJiNGJiY2JhMmQ1NDhjNDMzN2RkYWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzRkNTQxZTUyMGJlNGEwM2E0NDA4MjY0MzgyMjc3MmEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxOSwgMTc4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M4YjQwNjZjYjVlNDQ5YzE4MzU2YWEyZTg5ZjE0YThmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMzY2Y5YmVjNzFlZTRmZWI4MTY2MjQ2MjY5ZjBjZjgyID0gJCgnPGRpdiBpZD0iaHRtbF8zM2NmOWJlYzcxZWU0ZmViODE2NjI0NjI2OWYwY2Y4MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE3ODxicj5sYXQ6MTk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4YjQwNjZjYjVlNDQ5YzE4MzU2YWEyZTg5ZjE0YThmLnNldENvbnRlbnQoaHRtbF8zM2NmOWJlYzcxZWU0ZmViODE2NjI0NjI2OWYwY2Y4Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2M0ZDU0MWU1MjBiZTRhMDNhNDQwODI2NDM4MjI3NzJhLmJpbmRQb3B1cChwb3B1cF9jOGI0MDY2Y2I1ZTQ0OWMxODM1NmFhMmU4OWYxNGE4Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kZTU4ZTcyNmU4OGM0MjJlODk5Mjg3ZmE1MGRiZTQ4MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00OSwgLTE4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU4MDI2NjdkZjg0NTRlYzc4ZmFlODY4ZTgyZGI5NWI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JhNDliMTQ5Y2EyMzQyYWRhMDk0MzJiMmRkYzQ3NjE2ID0gJCgnPGRpdiBpZD0iaHRtbF9iYTQ5YjE0OWNhMjM0MmFkYTA5NDMyYjJkZGM0NzYxNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xODxicj5sYXQ6LTQ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ODAyNjY3ZGY4NDU0ZWM3OGZhZTg2OGU4MmRiOTViNy5zZXRDb250ZW50KGh0bWxfYmE0OWIxNDljYTIzNDJhZGEwOTQzMmIyZGRjNDc2MTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kZTU4ZTcyNmU4OGM0MjJlODk5Mjg3ZmE1MGRiZTQ4MS5iaW5kUG9wdXAocG9wdXBfNTgwMjY2N2RmODQ1NGVjNzhmYWU4NjhlODJkYjk1YjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWE3OWQwOWE5Y2U4NGNlMTliMzk5MzUyYmM2ZmUwODAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstODksIC05N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMzBmOTFlZmZhNDE0MTczYWYwOTM5NjY2MWY5MWMyNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMzZmNzliY2VmNTk0MmE3OTk2NGU3NTc4M2EzNGY0YiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzM2Zjc5YmNlZjU5NDJhNzk5NjRlNzU3ODNhMzRmNGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotOTc8YnI+bGF0Oi04OTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjMwZjkxZWZmYTQxNDE3M2FmMDkzOTY2NjFmOTFjMjUuc2V0Q29udGVudChodG1sXzMzNmY3OWJjZWY1OTQyYTc5OTY0ZTc1NzgzYTM0ZjRiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWE3OWQwOWE5Y2U4NGNlMTliMzk5MzUyYmM2ZmUwODAuYmluZFBvcHVwKHBvcHVwX2YzMGY5MWVmZmE0MTQxNzNhZjA5Mzk2NjYxZjkxYzI1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzU1ZTdmZjlkNzgyYTQ3MGY5NTllZmZmODFkOWM1ZmFlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTgxLCAtOTNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzk5ZTI5MjMwMjMzNDZiNjkzNGJlY2U3YmIxNmJhZDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjQ5NDY1MTM1ZmNkNDMwYTk5MTI2MTE1ZWEzMzFjOTggPSAkKCc8ZGl2IGlkPSJodG1sXzI0OTQ2NTEzNWZjZDQzMGE5OTEyNjExNWVhMzMxYzk4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTkzPGJyPmxhdDotODE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M5OWUyOTIzMDIzMzQ2YjY5MzRiZWNlN2JiMTZiYWQzLnNldENvbnRlbnQoaHRtbF8yNDk0NjUxMzVmY2Q0MzBhOTkxMjYxMTVlYTMzMWM5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU1ZTdmZjlkNzgyYTQ3MGY5NTllZmZmODFkOWM1ZmFlLmJpbmRQb3B1cChwb3B1cF9jOTllMjkyMzAyMzM0NmI2OTM0YmVjZTdiYjE2YmFkMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iODRlZjgzZWQxNGQ0MjhjYmU3YTVkNDk5MzlmNGZkNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LCAyNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNzk1OTE4YTk2YTU0OGNjYjdlZGZjYzA1Zjc0YWRmNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYWEwNjY1NGIxZTQ0NzIzOTUzM2NlZDgxMjYwOWQyOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmFhMDY2NTRiMWU0NDcyMzk1MzNjZWQ4MTI2MDlkMjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoyNDxicj5sYXQ6Mzc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3OTU5MThhOTZhNTQ4Y2NiN2VkZmNjMDVmNzRhZGY1LnNldENvbnRlbnQoaHRtbF9iYWEwNjY1NGIxZTQ0NzIzOTUzM2NlZDgxMjYwOWQyOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I4NGVmODNlZDE0ZDQyOGNiZTdhNWQ0OTkzOWY0ZmQ1LmJpbmRQb3B1cChwb3B1cF9kNzk1OTE4YTk2YTU0OGNjYjdlZGZjYzA1Zjc0YWRmNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81OThmNmIyNzRjZjY0ZTU4OTdmNjQ0YzdiMWQzZmM1OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzIwLCAtNzhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmU2ZDczZjVhOTRkNGJlMGExNTllMjI5ZjdiNmUyNTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzg0NDQ3ZDUwZmE1NDgzMDgyOGMwOGU1NTAxM2Y2NGEgPSAkKCc8ZGl2IGlkPSJodG1sXzc4NDQ0N2Q1MGZhNTQ4MzA4MjhjMDhlNTUwMTNmNjRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTc4PGJyPmxhdDoyMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmU2ZDczZjVhOTRkNGJlMGExNTllMjI5ZjdiNmUyNTQuc2V0Q29udGVudChodG1sXzc4NDQ0N2Q1MGZhNTQ4MzA4MjhjMDhlNTUwMTNmNjRhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTk4ZjZiMjc0Y2Y2NGU1ODk3ZjY0NGM3YjFkM2ZjNTguYmluZFBvcHVwKHBvcHVwX2ZlNmQ3M2Y1YTk0ZDRiZTBhMTU5ZTIyOWY3YjZlMjU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzViZDc4ZjZhZTEzMjQ0MGI4NmI2OWI5NmNkNjM3ZDk4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTksIC0zOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYWEzM2IwMGEzNGE0YWNiYjQ3N2VlMGQ4MzQ5N2MyNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YWMyMGEwYWIxYzM0NmYwYjg3NzdhM2YwOWMzNGFkMSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2FjMjBhMGFiMWMzNDZmMGI4Nzc3YTNmMDljMzRhZDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMzk8YnI+bGF0OjU5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYWEzM2IwMGEzNGE0YWNiYjQ3N2VlMGQ4MzQ5N2MyNi5zZXRDb250ZW50KGh0bWxfN2FjMjBhMGFiMWMzNDZmMGI4Nzc3YTNmMDljMzRhZDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81YmQ3OGY2YWUxMzI0NDBiODZiNjliOTZjZDYzN2Q5OC5iaW5kUG9wdXAocG9wdXBfZmFhMzNiMDBhMzRhNGFjYmI0NzdlZTBkODM0OTdjMjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTlkZmVkYzFhYTFlNGRhYzlkMmI5OTIxMzc4NmY2ZDEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNjEsIDMyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhNTAwM2VmMmJjYjQ1ZTZhZTllY2NhM2U4YmUwOTE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ4NjY1ODc3ZDRmYTQyZDI4NzkzZGQ5YzRhMjU0ZTlkID0gJCgnPGRpdiBpZD0iaHRtbF80ODY2NTg3N2Q0ZmE0MmQyODc5M2RkOWM0YTI1NGU5ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjMyPGJyPmxhdDotNjE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RhNTAwM2VmMmJjYjQ1ZTZhZTllY2NhM2U4YmUwOTE1LnNldENvbnRlbnQoaHRtbF80ODY2NTg3N2Q0ZmE0MmQyODc5M2RkOWM0YTI1NGU5ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU5ZGZlZGMxYWExZTRkYWM5ZDJiOTkyMTM3ODZmNmQxLmJpbmRQb3B1cChwb3B1cF9kYTUwMDNlZjJiY2I0NWU2YWU5ZWNjYTNlOGJlMDkxNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iMGI4YWI2YWZiZTQ0YTBlODQwZmQ1Y2JjNzA1ZTZiYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU5LCAtMTM5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QwMWUyN2JhMjUzZjQwNmY4YTYzN2RiZjYxODkwOGFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcyNDFlZDI1NTUyZDRlNzFiOTZlNjY4ZmI3NjQ3NDdlID0gJCgnPGRpdiBpZD0iaHRtbF83MjQxZWQyNTU1MmQ0ZTcxYjk2ZTY2OGZiNzY0NzQ3ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xMzk8YnI+bGF0OjU5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMDFlMjdiYTI1M2Y0MDZmOGE2MzdkYmY2MTg5MDhhYi5zZXRDb250ZW50KGh0bWxfNzI0MWVkMjU1NTJkNGU3MWI5NmU2NjhmYjc2NDc0N2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iMGI4YWI2YWZiZTQ0YTBlODQwZmQ1Y2JjNzA1ZTZiYy5iaW5kUG9wdXAocG9wdXBfZDAxZTI3YmEyNTNmNDA2ZjhhNjM3ZGJmNjE4OTA4YWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjY2ODE4ZDU5ZTAyNDgyOGI5M2JkYTZlNWU4NzU1NmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2NSwgOTRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWE2ZDE1YWMzNzI4NGQ3NDhhZWI1NGZiY2YwZmNiZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzg1MGRiNTNjNGI5NDU1NGIwNTFiNDUxZTY5NDRhNjAgPSAkKCc8ZGl2IGlkPSJodG1sXzM4NTBkYjUzYzRiOTQ1NTRiMDUxYjQ1MWU2OTQ0YTYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246OTQ8YnI+bGF0OjY1PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTZkMTVhYzM3Mjg0ZDc0OGFlYjU0ZmJjZjBmY2JkYi5zZXRDb250ZW50KGh0bWxfMzg1MGRiNTNjNGI5NDU1NGIwNTFiNDUxZTY5NDRhNjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82NjY4MThkNTllMDI0ODI4YjkzYmRhNmU1ZTg3NTU2ZS5iaW5kUG9wdXAocG9wdXBfYWE2ZDE1YWMzNzI4NGQ3NDhhZWI1NGZiY2YwZmNiZGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjE1Y2NkMTNiZjZlNDQ3NmEwOGQ4ZGJkYjY5NWI3ZGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszMywgLTE0M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNjQwNjA5NDc3NDk0YWM5ODEyMDc0M2Y0YjcxZDA3OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMmVlYmM4OWRhNGI0MTdmOGE5Mzc4MDVmZGY3ZWIzZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTJlZWJjODlkYTRiNDE3ZjhhOTM3ODA1ZmRmN2ViM2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTQzPGJyPmxhdDozMzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDY0MDYwOTQ3NzQ5NGFjOTgxMjA3NDNmNGI3MWQwNzguc2V0Q29udGVudChodG1sX2EyZWViYzg5ZGE0YjQxN2Y4YTkzNzgwNWZkZjdlYjNlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjE1Y2NkMTNiZjZlNDQ3NmEwOGQ4ZGJkYjY5NWI3ZGYuYmluZFBvcHVwKHBvcHVwXzA2NDA2MDk0Nzc0OTRhYzk4MTIwNzQzZjRiNzFkMDc4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQ4ZmEwOTM3NGE5NTRiMmZhMWYwYWFjYzc5NWU3YjEzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTQ5LCA1N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZTEzM2I5ZTQ0NTM0YTNkYTQ0NWQ3NjdiNjJmYWE2MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84M2EwZTExZDgxMDU0Mjk2YTUxNTMxMjliMTAxMTRlOCA9ICQoJzxkaXYgaWQ9Imh0bWxfODNhMGUxMWQ4MTA1NDI5NmE1MTUzMTI5YjEwMTE0ZTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjo1Nzxicj5sYXQ6LTQ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZTEzM2I5ZTQ0NTM0YTNkYTQ0NWQ3NjdiNjJmYWE2MS5zZXRDb250ZW50KGh0bWxfODNhMGUxMWQ4MTA1NDI5NmE1MTUzMTI5YjEwMTE0ZTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80OGZhMDkzNzRhOTU0YjJmYTFmMGFhY2M3OTVlN2IxMy5iaW5kUG9wdXAocG9wdXBfY2UxMzNiOWU0NDUzNGEzZGE0NDVkNzY3YjYyZmFhNjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGNiMmY3NzZhZTMwNDJlNjhlOTJlNWJmMWVkNTFjZmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2LCAxMjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmFkYTNiNTlkZDkzNDVhNGI3OTc5MGI5YTBhMDJiMTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWZmODMzNTVjMTEyNDUwMzkxOGY5YTlmMGI5YjRiNWEgPSAkKCc8ZGl2IGlkPSJodG1sX2VmZjgzMzU1YzExMjQ1MDM5MThmOWE5ZjBiOWI0YjVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTIzPGJyPmxhdDo2PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYWRhM2I1OWRkOTM0NWE0Yjc5NzkwYjlhMGEwMmIxMS5zZXRDb250ZW50KGh0bWxfZWZmODMzNTVjMTEyNDUwMzkxOGY5YTlmMGI5YjRiNWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84Y2IyZjc3NmFlMzA0MmU2OGU5MmU1YmYxZWQ1MWNmZC5iaW5kUG9wdXAocG9wdXBfZmFkYTNiNTlkZDkzNDVhNGI3OTc5MGI5YTBhMDJiMTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjk5OTUzYzYzYmU3NGFiMWI5OTUyNzAyOGFhN2Q0ZmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNjQsIC01Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNGRiMmFkZTU4YmQ0Y2ZmOGMwZDk4MzA1ZmY2NzExNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMTQ4MjYyZDE0MDE0ZjBlYTQxOGVhMWRlNWY0MzgwNSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzE0ODI2MmQxNDAxNGYwZWE0MThlYTFkZTVmNDM4MDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotNTY8YnI+bGF0Oi02NDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDRkYjJhZGU1OGJkNGNmZjhjMGQ5ODMwNWZmNjcxMTYuc2V0Q29udGVudChodG1sXzMxNDgyNjJkMTQwMTRmMGVhNDE4ZWExZGU1ZjQzODA1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjk5OTUzYzYzYmU3NGFiMWI5OTUyNzAyOGFhN2Q0ZmQuYmluZFBvcHVwKHBvcHVwXzA0ZGIyYWRlNThiZDRjZmY4YzBkOTgzMDVmZjY3MTE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzM2NThhZDI0MTAyYTQwY2JiM2EzZDllYzVlYjdiOTJmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQsIDUyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U1NWJmNmU3ODFiNTQ2NDQ5MjM4ZDgyZmE2ZDk3ZTc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y5OGEwNTc3ZDlhMjQ4NWE4NTEzZjlhYjI0NzQ4YWNmID0gJCgnPGRpdiBpZD0iaHRtbF9mOThhMDU3N2Q5YTI0ODVhODUxM2Y5YWIyNDc0OGFjZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjUyPGJyPmxhdDo1NDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTU1YmY2ZTc4MWI1NDY0NDkyMzhkODJmYTZkOTdlNzYuc2V0Q29udGVudChodG1sX2Y5OGEwNTc3ZDlhMjQ4NWE4NTEzZjlhYjI0NzQ4YWNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzY1OGFkMjQxMDJhNDBjYmIzYTNkOWVjNWViN2I5MmYuYmluZFBvcHVwKHBvcHVwX2U1NWJmNmU3ODFiNTQ2NDQ5MjM4ZDgyZmE2ZDk3ZTc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI1ZTNjMTk4MzUwMDRmY2RiYmFhOGZjMmRmMTFhNzNjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTI3LCAxMTBdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjg0MzY2MjMzZmEzNDRlNWFhODUyZDQ1NTU0YWI2ZTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Q2ZGVlNzQ0Y2UxNGJiMzhlZGI4Y2Q0MTU3N2MxNTMgPSAkKCc8ZGl2IGlkPSJodG1sX2NkNmRlZTc0NGNlMTRiYjM4ZWRiOGNkNDE1NzdjMTUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTEwPGJyPmxhdDotMjc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY4NDM2NjIzM2ZhMzQ0ZTVhYTg1MmQ0NTU1NGFiNmU4LnNldENvbnRlbnQoaHRtbF9jZDZkZWU3NDRjZTE0YmIzOGVkYjhjZDQxNTc3YzE1Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzI1ZTNjMTk4MzUwMDRmY2RiYmFhOGZjMmRmMTFhNzNjLmJpbmRQb3B1cChwb3B1cF82ODQzNjYyMzNmYTM0NGU1YWE4NTJkNDU1NTRhYjZlOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMDI2MmZhM2I4NzU0ZTdhYjk1NjI5ZTk0ODJkMDkwNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy04MiwgLTE0N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNThkNmJkYmU4M2Q0MzIyOGVkNzBlYzk1YjI0YThmYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNjVmNjJkODA3YmI0ODIyYWE0YWRiOTQ1ZGYwZGNjYSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzY1ZjYyZDgwN2JiNDgyMmFhNGFkYjk0NWRmMGRjY2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTQ3PGJyPmxhdDotODI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q1OGQ2YmRiZTgzZDQzMjI4ZWQ3MGVjOTViMjRhOGZiLnNldENvbnRlbnQoaHRtbF9jNjVmNjJkODA3YmI0ODIyYWE0YWRiOTQ1ZGYwZGNjYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzMwMjYyZmEzYjg3NTRlN2FiOTU2MjllOTQ4MmQwOTA2LmJpbmRQb3B1cChwb3B1cF9kNThkNmJkYmU4M2Q0MzIyOGVkNzBlYzk1YjI0YThmYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83ZDRhNTUyYWJjM2I0NWVlOGM3NDE1ZWY2OWI4NjFkYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00OSwgLTExM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kM2I5MWIxZDVhYWU0ZmJhOTQ0NTUwZDgyMjUzMmM1MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYzI2NDEzOTA2ZDE0Y2ViYWFmODc1ZDVkYTIzMGFkMCA9ICQoJzxkaXYgaWQ9Imh0bWxfM2MyNjQxMzkwNmQxNGNlYmFhZjg3NWQ1ZGEyMzBhZDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTEzPGJyPmxhdDotNDk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QzYjkxYjFkNWFhZTRmYmE5NDQ1NTBkODIyNTMyYzUxLnNldENvbnRlbnQoaHRtbF8zYzI2NDEzOTA2ZDE0Y2ViYWFmODc1ZDVkYTIzMGFkMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdkNGE1NTJhYmMzYjQ1ZWU4Yzc0MTVlZjY5Yjg2MWRjLmJpbmRQb3B1cChwb3B1cF9kM2I5MWIxZDVhYWU0ZmJhOTQ0NTUwZDgyMjUzMmM1MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wOTRlMWEzODNjMDU0NWU1YmE0ZGRiZDNlZTg1MTNiYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMCwgLTE0NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNWViZmU1YjdhZWQ0NTY0ODQzY2ZhZmFhMzc4ZmYxMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZWMxMDg3NTI3MmQ0MzIzOGViNDJmYWIzZDhhMmYxZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZmVjMTA4NzUyNzJkNDMyMzhlYjQyZmFiM2Q4YTJmMWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTQ1PGJyPmxhdDotMjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI1ZWJmZTViN2FlZDQ1NjQ4NDNjZmFmYWEzNzhmZjEwLnNldENvbnRlbnQoaHRtbF9mZWMxMDg3NTI3MmQ0MzIzOGViNDJmYWIzZDhhMmYxZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA5NGUxYTM4M2MwNTQ1ZTViYTRkZGJkM2VlODUxM2JiLmJpbmRQb3B1cChwb3B1cF8yNWViZmU1YjdhZWQ0NTY0ODQzY2ZhZmFhMzc4ZmYxMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNmJmYjhlNDE1Y2U0Y2NmYmU4YzVjOTYzMTJmMzZlZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU5LCA1Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZjIzNzc3NTlhODU0NjU2YmU2NzI5NDJjYTIxMmMyZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMzQzNmU3MTdhNjQ0ZDY0YTI3MTkxYTZmOTU3NTg4NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDM0MzZlNzE3YTY0NGQ2NGEyNzE5MWE2Zjk1NzU4ODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjo1Njxicj5sYXQ6NTk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJmMjM3Nzc1OWE4NTQ2NTZiZTY3Mjk0MmNhMjEyYzJlLnNldENvbnRlbnQoaHRtbF8wMzQzNmU3MTdhNjQ0ZDY0YTI3MTkxYTZmOTU3NTg4NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y2YmZiOGU0MTVjZTRjY2ZiZThjNWM5NjMxMmYzNmVlLmJpbmRQb3B1cChwb3B1cF8yZjIzNzc3NTlhODU0NjU2YmU2NzI5NDJjYTIxMmMyZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hYjE4NGY3MzFjNmM0YmQ1OTgzMjBmODgwMjUxYWMwYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU1LCAxMDZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTE3MTg0NTdjMzcwNGEwZGJmYzE2YjkzNmQ2ZjljNDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2EwZGNiZmVmZTIzNDhhY2E2ZjE2YmVlNTYxZmZhNDMgPSAkKCc8ZGl2IGlkPSJodG1sX2NhMGRjYmZlZmUyMzQ4YWNhNmYxNmJlZTU2MWZmYTQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTA2PGJyPmxhdDo1NTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTE3MTg0NTdjMzcwNGEwZGJmYzE2YjkzNmQ2ZjljNDAuc2V0Q29udGVudChodG1sX2NhMGRjYmZlZmUyMzQ4YWNhNmYxNmJlZTU2MWZmYTQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYWIxODRmNzMxYzZjNGJkNTk4MzIwZjg4MDI1MWFjMGEuYmluZFBvcHVwKHBvcHVwX2UxNzE4NDU3YzM3MDRhMGRiZmMxNmI5MzZkNmY5YzQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2FiNWNkZjljYWRjYjQ1MDE4Y2U3YTZjZGUyYjRmMzdhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTg1LCAtNjZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzRlMWE4YTdjODcxNDY5Mzk5MzJjYzgwNWU4ZjE3NmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTUwMGExYmE0MTA5NDE0ZGFiOWM1N2I4NTA4NzRhNjggPSAkKCc8ZGl2IGlkPSJodG1sXzk1MDBhMWJhNDEwOTQxNGRhYjljNTdiODUwODc0YTY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTY2PGJyPmxhdDotODU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM0ZTFhOGE3Yzg3MTQ2OTM5OTMyY2M4MDVlOGYxNzZkLnNldENvbnRlbnQoaHRtbF85NTAwYTFiYTQxMDk0MTRkYWI5YzU3Yjg1MDg3NGE2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2FiNWNkZjljYWRjYjQ1MDE4Y2U3YTZjZGUyYjRmMzdhLmJpbmRQb3B1cChwb3B1cF8zNGUxYThhN2M4NzE0NjkzOTkzMmNjODA1ZThmMTc2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mYjZhYzJiYWJlNjE0ODA4YWYyZDg4MmNlMjYzZGQzMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy04NiwgLTE2Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NmY0OTBiNzA4ODQ0MGIwOWYzYzdlY2IyNGVjMzk2YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZWYxMjQ1OTg4NTE0MDZmYjIzNWNmMjUyMzM1OTc4MCA9ICQoJzxkaXYgaWQ9Imh0bWxfYWVmMTI0NTk4ODUxNDA2ZmIyMzVjZjI1MjMzNTk3ODAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTYyPGJyPmxhdDotODY8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk2ZjQ5MGI3MDg4NDQwYjA5ZjNjN2VjYjI0ZWMzOTZiLnNldENvbnRlbnQoaHRtbF9hZWYxMjQ1OTg4NTE0MDZmYjIzNWNmMjUyMzM1OTc4MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2ZiNmFjMmJhYmU2MTQ4MDhhZjJkODgyY2UyNjNkZDMzLmJpbmRQb3B1cChwb3B1cF85NmY0OTBiNzA4ODQ0MGIwOWYzYzdlY2IyNGVjMzk2Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wMjgzYzE1MTUwODM0OGI4Yjk4OTI5ZmEzOTk4YjMxYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00LCAyN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NjE1ZGRkMmMwNDQ0YzQ0YjhlYTljZTdhYWQ0NDJhNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yM2RlOTFmMTJmNzU0ZGE3YTI3NmNiMjYxNWJiN2ZlNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjNkZTkxZjEyZjc1NGRhN2EyNzZjYjI2MTViYjdmZTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoyNzxicj5sYXQ6LTQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2MTVkZGQyYzA0NDRjNDRiOGVhOWNlN2FhZDQ0MmE3LnNldENvbnRlbnQoaHRtbF8yM2RlOTFmMTJmNzU0ZGE3YTI3NmNiMjYxNWJiN2ZlNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzAyODNjMTUxNTA4MzQ4YjhiOTg5MjlmYTM5OThiMzFhLmJpbmRQb3B1cChwb3B1cF82NjE1ZGRkMmMwNDQ0YzQ0YjhlYTljZTdhYWQ0NDJhNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zNjFmZjdlMzEzNmI0OTBlYmVmMmZmNDMxMDMyY2IxNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLCAtMTBdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmRiMzFhNjJhNjVjNDgwMWExYzA3YWQxOTQ5YzYwZmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWI0MzA1MWVlZTI0NGIwMzg5YTg1NDM3YzQzNmZmY2UgPSAkKCc8ZGl2IGlkPSJodG1sXzliNDMwNTFlZWUyNDRiMDM4OWE4NTQzN2M0MzZmZmNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTEwPGJyPmxhdDo1MDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmRiMzFhNjJhNjVjNDgwMWExYzA3YWQxOTQ5YzYwZmUuc2V0Q29udGVudChodG1sXzliNDMwNTFlZWUyNDRiMDM4OWE4NTQzN2M0MzZmZmNlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzYxZmY3ZTMxMzZiNDkwZWJlZjJmZjQzMTAzMmNiMTQuYmluZFBvcHVwKHBvcHVwXzJkYjMxYTYyYTY1YzQ4MDFhMWMwN2FkMTk0OWM2MGZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2ZjZDU1MjkyYjUyMzQ4Y2E5MzQ2YzU1OThkZDlkNDJkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTc1LCAtMjFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGE5NzQ0MGRiZDRjNDNlYTkyMzNkZWJkNDUwM2YzYjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDA2ZjBmNmE1MzgxNDM1MTllODNjNzlmNGVmOTZkNWMgPSAkKCc8ZGl2IGlkPSJodG1sXzQwNmYwZjZhNTM4MTQzNTE5ZTgzYzc5ZjRlZjk2ZDVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTIxPGJyPmxhdDotNzU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRhOTc0NDBkYmQ0YzQzZWE5MjMzZGViZDQ1MDNmM2I5LnNldENvbnRlbnQoaHRtbF80MDZmMGY2YTUzODE0MzUxOWU4M2M3OWY0ZWY5NmQ1Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2ZjZDU1MjkyYjUyMzQ4Y2E5MzQ2YzU1OThkZDlkNDJkLmJpbmRQb3B1cChwb3B1cF80YTk3NDQwZGJkNGM0M2VhOTIzM2RlYmQ0NTAzZjNiOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83MDZlYzFhMmY1Mzc0ZDhhOGE0YzA4ZmZlZDAyNjA2YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy04MywgLTE1MF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MmRkYjU2YjRlYmY0MGIyODNlMDI3MTZiZDAzMDE2ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNjJmYmM2NTliOWY0MDllYmJkOGYxMGY5OTUxOGNmYSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzYyZmJjNjU5YjlmNDA5ZWJiZDhmMTBmOTk1MThjZmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTUwPGJyPmxhdDotODM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgyZGRiNTZiNGViZjQwYjI4M2UwMjcxNmJkMDMwMTZmLnNldENvbnRlbnQoaHRtbF9jNjJmYmM2NTliOWY0MDllYmJkOGYxMGY5OTUxOGNmYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzcwNmVjMWEyZjUzNzRkOGE4YTRjMDhmZmVkMDI2MDZjLmJpbmRQb3B1cChwb3B1cF84MmRkYjU2YjRlYmY0MGIyODNlMDI3MTZiZDAzMDE2Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82NGI4NGUwMTUxMTU0YmQyYTczZWM5ZDExOTVmZDdiYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU4LCAtNTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2UwMDRmMjVkNTkxNDE4ODg1Mzg5ZmYwZGNiZjFjYjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjBhOWU4MDJhNmEyNDFmNjk5NzNhZjVmMDE4MDQ0YTIgPSAkKCc8ZGl2IGlkPSJodG1sX2IwYTllODAyYTZhMjQxZjY5OTczYWY1ZjAxODA0NGEyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTU5PGJyPmxhdDo1ODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2UwMDRmMjVkNTkxNDE4ODg1Mzg5ZmYwZGNiZjFjYjUuc2V0Q29udGVudChodG1sX2IwYTllODAyYTZhMjQxZjY5OTczYWY1ZjAxODA0NGEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjRiODRlMDE1MTE1NGJkMmE3M2VjOWQxMTk1ZmQ3YmIuYmluZFBvcHVwKHBvcHVwXzNlMDA0ZjI1ZDU5MTQxODg4NTM4OWZmMGRjYmYxY2I1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2E2Njg0NDFhNGFkYzRjZjFiN2IwN2EyZmU3NzAxZWU1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMjYsIDY5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUwZTdkNmRkMzM2MzQwM2FiNzM5MjdlMjVmYTcxMmViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5MzY2YmUyMTBhYTQ0MGRhMjc4NjU1ODM3NDU0ZTVmID0gJCgnPGRpdiBpZD0iaHRtbF82OTM2NmJlMjEwYWE0NDBkYTI3ODY1NTgzNzQ1NGU1ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjY5PGJyPmxhdDoyNjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTBlN2Q2ZGQzMzYzNDAzYWI3MzkyN2UyNWZhNzEyZWIuc2V0Q29udGVudChodG1sXzY5MzY2YmUyMTBhYTQ0MGRhMjc4NjU1ODM3NDU0ZTVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTY2ODQ0MWE0YWRjNGNmMWI3YjA3YTJmZTc3MDFlZTUuYmluZFBvcHVwKHBvcHVwXzUwZTdkNmRkMzM2MzQwM2FiNzM5MjdlMjVmYTcxMmViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzNlNmNhNDNhYWMzNjQ0ZTM5YWVmNjdiOTcxMWMwYjFkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbODQsIC0yN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNjZmYWIwMzQxNjk0ZGIzYTc2YjEwMGM5MTdmMDEwNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jN2Q5ODk1ZDUxZWM0YjFiOGM2MjM2YmU2Mjk2NWM4MiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzdkOTg5NWQ1MWVjNGIxYjhjNjIzNmJlNjI5NjVjODIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMjc8YnI+bGF0Ojg0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNjZmYWIwMzQxNjk0ZGIzYTc2YjEwMGM5MTdmMDEwNC5zZXRDb250ZW50KGh0bWxfYzdkOTg5NWQ1MWVjNGIxYjhjNjIzNmJlNjI5NjVjODIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zZTZjYTQzYWFjMzY0NGUzOWFlZjY3Yjk3MTFjMGIxZC5iaW5kUG9wdXAocG9wdXBfYzY2ZmFiMDM0MTY5NGRiM2E3NmIxMDBjOTE3ZjAxMDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmNlNWY1Y2ZlOTgzNDhkNmI1ZmE2NzMzNTNmN2FhYjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3NywgLTEyNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZjA0NTllYWI4NjA0ZDU2YTFkNGUwYTEwZDhkMTRhYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMDU5M2E0ZTA3ZWQ0OGEyYTNjOGRiOTQ0MjdkZjE4MSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzA1OTNhNGUwN2VkNDhhMmEzYzhkYjk0NDI3ZGYxODEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTI1PGJyPmxhdDo3NzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGYwNDU5ZWFiODYwNGQ1NmExZDRlMGExMGQ4ZDE0YWMuc2V0Q29udGVudChodG1sX2MwNTkzYTRlMDdlZDQ4YTJhM2M4ZGI5NDQyN2RmMTgxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNmNlNWY1Y2ZlOTgzNDhkNmI1ZmE2NzMzNTNmN2FhYjYuYmluZFBvcHVwKHBvcHVwXzRmMDQ1OWVhYjg2MDRkNTZhMWQ0ZTBhMTBkOGQxNGFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzZhMWI0NTkzMzQ0ODQxMmQ4ZmQ0MTBmMDlkNzhkNTA0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LCAtNjldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjY5MzkzMjY3NGVmNGZjY2ExZDhhZjc1ZjZjY2I5YmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGZjN2NjODdkYmVkNGI1Y2JlNjc3MjkzMzM0YWQ3MTEgPSAkKCc8ZGl2IGlkPSJodG1sXzBmYzdjYzg3ZGJlZDRiNWNiZTY3NzI5MzMzNGFkNzExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTY5PGJyPmxhdDotMTk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y2OTM5MzI2NzRlZjRmY2NhMWQ4YWY3NWY2Y2NiOWJjLnNldENvbnRlbnQoaHRtbF8wZmM3Y2M4N2RiZWQ0YjVjYmU2NzcyOTMzMzRhZDcxMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZhMWI0NTkzMzQ0ODQxMmQ4ZmQ0MTBmMDlkNzhkNTA0LmJpbmRQb3B1cChwb3B1cF9mNjkzOTMyNjc0ZWY0ZmNjYTFkOGFmNzVmNmNjYjliYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82YzNhNDdiNGNmMjY0MGIyOTEwOThlNzE1MWY1YTNmYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ2LCAxNDddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTQzNjM3ODQxZDMxNDMyYmI1N2Y0YWFjMDVhMWE2YWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmNkZTY1ZTQ0NTNlNDA3YWExZDI1Yjc0MjJlOTNlYWMgPSAkKCc8ZGl2IGlkPSJodG1sXzJjZGU2NWU0NDUzZTQwN2FhMWQyNWI3NDIyZTkzZWFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTQ3PGJyPmxhdDo0NjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTQzNjM3ODQxZDMxNDMyYmI1N2Y0YWFjMDVhMWE2YWUuc2V0Q29udGVudChodG1sXzJjZGU2NWU0NDUzZTQwN2FhMWQyNWI3NDIyZTkzZWFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNmMzYTQ3YjRjZjI2NDBiMjkxMDk4ZTcxNTFmNWEzZmEuYmluZFBvcHVwKHBvcHVwXzU0MzYzNzg0MWQzMTQzMmJiNTdmNGFhYzA1YTFhNmFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzZmNjlmYzFhNmM5NDQ4ZWRiOWI2NDYwZjYyZDdjZjc0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTc0LCA4OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80M2NhOGVmZDkxZTY0ODEwODQ4NThkN2M3YzIyNDU4MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYWMyMDc4NzY0OWQ0NzUwYjA4ZDhhZjg4YjA3ZWY1ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfY2FjMjA3ODc2NDlkNDc1MGIwOGQ4YWY4OGIwN2VmNWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjo4ODxicj5sYXQ6LTc0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80M2NhOGVmZDkxZTY0ODEwODQ4NThkN2M3YzIyNDU4MC5zZXRDb250ZW50KGh0bWxfY2FjMjA3ODc2NDlkNDc1MGIwOGQ4YWY4OGIwN2VmNWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82ZjY5ZmMxYTZjOTQ0OGVkYjliNjQ2MGY2MmQ3Y2Y3NC5iaW5kUG9wdXAocG9wdXBfNDNjYThlZmQ5MWU2NDgxMDg0ODU4ZDdjN2MyMjQ1ODApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODBlNjdhNzc3Mjg5NGU5Mjk2MjdhMWI0OTg3ODczYTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjMsIC0xNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYTQ3MDQ2NTRkMTM0ZTdlYmIxOWNjZGYzNTk1N2U1YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZDkxNDUwZGEwNzU0OTc0YTJmMzE4ZDFhZDRhN2RlNyA9ICQoJzxkaXYgaWQ9Imh0bWxfN2Q5MTQ1MGRhMDc1NDk3NGEyZjMxOGQxYWQ0YTdkZTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTU8YnI+bGF0Oi0yMzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2E0NzA0NjU0ZDEzNGU3ZWJiMTljY2RmMzU5NTdlNWEuc2V0Q29udGVudChodG1sXzdkOTE0NTBkYTA3NTQ5NzRhMmYzMThkMWFkNGE3ZGU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODBlNjdhNzc3Mjg5NGU5Mjk2MjdhMWI0OTg3ODczYTMuYmluZFBvcHVwKHBvcHVwX2NhNDcwNDY1NGQxMzRlN2ViYjE5Y2NkZjM1OTU3ZTVhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzY1NzMwYmEyYjRkYzQ0ZTBhZWNiNThlYTM5ZGI3ZDk2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEsIC04NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMjMxNDgxMzk3OTU0ODkxYmNmMmU5ZGNjZjFiMWU2MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MGVhYmQ2NjE5MGY0MTUwYWQxYjA5NWU5ZjRiY2NmZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjBlYWJkNjYxOTBmNDE1MGFkMWIwOTVlOWY0YmNjZmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotODU8YnI+bGF0OjQxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMjMxNDgxMzk3OTU0ODkxYmNmMmU5ZGNjZjFiMWU2Mi5zZXRDb250ZW50KGh0bWxfNjBlYWJkNjYxOTBmNDE1MGFkMWIwOTVlOWY0YmNjZmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82NTczMGJhMmI0ZGM0NGUwYWVjYjU4ZWEzOWRiN2Q5Ni5iaW5kUG9wdXAocG9wdXBfYzIzMTQ4MTM5Nzk1NDg5MWJjZjJlOWRjY2YxYjFlNjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2Q4ZGYwYzg5ZjE2NGMzMDgxYzJiZWI3ZDk0MTkxNDcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMzYsIC0xMzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDNkZmUxYzVkYzk2NDQ3MWIzMmUyYTAwZjlkN2E2YzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDEyNzE1NjMwODc1NDMyMmEwZTJlYzFlMTQ1NzUxOGMgPSAkKCc8ZGl2IGlkPSJodG1sX2QxMjcxNTYzMDg3NTQzMjJhMGUyZWMxZTE0NTc1MThjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTEzOTxicj5sYXQ6LTM2PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kM2RmZTFjNWRjOTY0NDcxYjMyZTJhMDBmOWQ3YTZjMy5zZXRDb250ZW50KGh0bWxfZDEyNzE1NjMwODc1NDMyMmEwZTJlYzFlMTQ1NzUxOGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83ZDhkZjBjODlmMTY0YzMwODFjMmJlYjdkOTQxOTE0Ny5iaW5kUG9wdXAocG9wdXBfZDNkZmUxYzVkYzk2NDQ3MWIzMmUyYTAwZjlkN2E2YzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTI5ZDE4MjJmNjVhNGZhM2EyOGQxNmUxMGU2NWYwZGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs4OSwgMTczXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmZTAxYzJkNmZmODQzMmZhMmJjODQ4NjBlMzI2YjBkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M2ZTE1N2QyMDEyOTQwYzZiZGNhYzE2MTE2M2IzNmVkID0gJCgnPGRpdiBpZD0iaHRtbF9jNmUxNTdkMjAxMjk0MGM2YmRjYWMxNjExNjNiMzZlZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE3Mzxicj5sYXQ6ODk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmZTAxYzJkNmZmODQzMmZhMmJjODQ4NjBlMzI2YjBkLnNldENvbnRlbnQoaHRtbF9jNmUxNTdkMjAxMjk0MGM2YmRjYWMxNjExNjNiMzZlZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2EyOWQxODIyZjY1YTRmYTNhMjhkMTZlMTBlNjVmMGRlLmJpbmRQb3B1cChwb3B1cF9hZmUwMWMyZDZmZjg0MzJmYTJiYzg0ODYwZTMyNmIwZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mMjAyZjViOWI1MzI0Y2JkYWI1OWIwZGYxNjhlMWYzOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU3LCAtOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMGU2ZjJlNmU2MGM0MDMxYmQ4NjlkMDM1ZmIyOGUyMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NjgzYjBmNTQ4YzY0ZTRjOTA2OTRlN2UzNDRkYThmYyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTY4M2IwZjU0OGM2NGU0YzkwNjk0ZTdlMzQ0ZGE4ZmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotOTxicj5sYXQ6NTc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwZTZmMmU2ZTYwYzQwMzFiZDg2OWQwMzVmYjI4ZTIwLnNldENvbnRlbnQoaHRtbF85NjgzYjBmNTQ4YzY0ZTRjOTA2OTRlN2UzNDRkYThmYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2YyMDJmNWI5YjUzMjRjYmRhYjU5YjBkZjE2OGUxZjM5LmJpbmRQb3B1cChwb3B1cF8xMGU2ZjJlNmU2MGM0MDMxYmQ4NjlkMDM1ZmIyOGUyMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kZDVjM2U0MGE0NDE0ZjM3OTJjNTMxOWUxM2RjZWUwNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0zNywgLTE0Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZTY1ZTFiMWJhZWY0NGVhYmE2MTc4MGVkYjAzM2RmNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNjY3Yjg4ZDViOGY0ZWJmYjg1NzcyNjdkMmUxYTllMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTY2N2I4OGQ1YjhmNGViZmI4NTc3MjY3ZDJlMWE5ZTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTQyPGJyPmxhdDotMzc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzllNjVlMWIxYmFlZjQ0ZWFiYTYxNzgwZWRiMDMzZGY1LnNldENvbnRlbnQoaHRtbF8xNjY3Yjg4ZDViOGY0ZWJmYjg1NzcyNjdkMmUxYTllMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RkNWMzZTQwYTQ0MTRmMzc5MmM1MzE5ZTEzZGNlZTA2LmJpbmRQb3B1cChwb3B1cF85ZTY1ZTFiMWJhZWY0NGVhYmE2MTc4MGVkYjAzM2RmNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yNGYwZDliMTYwMzA0Mzc1YThlMzE2OGNmMDEyMWYwZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ1LCAxNDhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDU4NzdjZDI5N2RiNGU5NGJmNTkwZWY0ODMyZjNmNTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzY4MDhjNmRhM2Y5NGY0MWIzMWU2ZWYxZDkwZDlmOWEgPSAkKCc8ZGl2IGlkPSJodG1sXzM2ODA4YzZkYTNmOTRmNDFiMzFlNmVmMWQ5MGQ5ZjlhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTQ4PGJyPmxhdDo0NTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDU4NzdjZDI5N2RiNGU5NGJmNTkwZWY0ODMyZjNmNTguc2V0Q29udGVudChodG1sXzM2ODA4YzZkYTNmOTRmNDFiMzFlNmVmMWQ5MGQ5ZjlhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjRmMGQ5YjE2MDMwNDM3NWE4ZTMxNjhjZjAxMjFmMGQuYmluZFBvcHVwKHBvcHVwXzA1ODc3Y2QyOTdkYjRlOTRiZjU5MGVmNDgzMmYzZjU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzljYzA4ZGZhZDUwNDRkZDA5MjczNGVmOGZjNmI4Zjg1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMjUsIC02Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNTBjMmFjOWMzN2U0YWJjOTc4NDlhYjU4ZTQxODJkNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZGQ3NWMwZjgxM2U0ZjEyODI4NGZlZWQ5MTY5ODhkYyA9ICQoJzxkaXYgaWQ9Imh0bWxfMmRkNzVjMGY4MTNlNGYxMjgyODRmZWVkOTE2OTg4ZGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotNjY8YnI+bGF0OjI1PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNTBjMmFjOWMzN2U0YWJjOTc4NDlhYjU4ZTQxODJkNC5zZXRDb250ZW50KGh0bWxfMmRkNzVjMGY4MTNlNGYxMjgyODRmZWVkOTE2OTg4ZGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85Y2MwOGRmYWQ1MDQ0ZGQwOTI3MzRlZjhmYzZiOGY4NS5iaW5kUG9wdXAocG9wdXBfYjUwYzJhYzljMzdlNGFiYzk3ODQ5YWI1OGU0MTgyZDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDRmYTQ0NDE0YzdkNGEyNWFlODljZDU4M2EzZGM4MzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MCwgMTQ4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EzMzM4ZjIwZGIxYjQ2ZDg4ZDcwZTBlOWI4ZmRkYzQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc4MmU0YmRlZDY1ODQ1N2ZhMTkzZjk4MGM0ZjAwMDk3ID0gJCgnPGRpdiBpZD0iaHRtbF83ODJlNGJkZWQ2NTg0NTdmYTE5M2Y5ODBjNGYwMDA5NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjE0ODxicj5sYXQ6NTA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EzMzM4ZjIwZGIxYjQ2ZDg4ZDcwZTBlOWI4ZmRkYzQzLnNldENvbnRlbnQoaHRtbF83ODJlNGJkZWQ2NTg0NTdmYTE5M2Y5ODBjNGYwMDA5Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Q0ZmE0NDQxNGM3ZDRhMjVhZTg5Y2Q1ODNhM2RjODM5LmJpbmRQb3B1cChwb3B1cF9hMzMzOGYyMGRiMWI0NmQ4OGQ3MGUwZTliOGZkZGM0Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zYTIxYzM5ZDYyMzE0NWFjOTFiMDg3ZDc3ODQxYTU4ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00NywgLTE3M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMmM5Nzc5MjE4OGU0YzhhYjc0MDMxMTU5YWZmOWFjZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MzcyN2JmNGNmYTU0NmM0YmQwZGNjOThiYzZmZDI0ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzM3MjdiZjRjZmE1NDZjNGJkMGRjYzk4YmM2ZmQyNGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTczPGJyPmxhdDotNDc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIyYzk3NzkyMTg4ZTRjOGFiNzQwMzExNTlhZmY5YWNmLnNldENvbnRlbnQoaHRtbF83MzcyN2JmNGNmYTU0NmM0YmQwZGNjOThiYzZmZDI0Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzNhMjFjMzlkNjIzMTQ1YWM5MWIwODdkNzc4NDFhNThlLmJpbmRQb3B1cChwb3B1cF8yMmM5Nzc5MjE4OGU0YzhhYjc0MDMxMTU5YWZmOWFjZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lNWI3ZjZmOTZiNTY0OWYyOGRjZjMyYzhkYmU4MWIyMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzI4LCAtMTU2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU3ZWY0OThkOGFkODQ2MzA5OGYwZmVkMWNlY2VkYmVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZiZTcwMzcyODYxODRjNjZiYjVkMDQ4MmVhZjMzMDk3ID0gJCgnPGRpdiBpZD0iaHRtbF82YmU3MDM3Mjg2MTg0YzY2YmI1ZDA0ODJlYWYzMzA5NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xNTY8YnI+bGF0OjI4PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81N2VmNDk4ZDhhZDg0NjMwOThmMGZlZDFjZWNlZGJlZC5zZXRDb250ZW50KGh0bWxfNmJlNzAzNzI4NjE4NGM2NmJiNWQwNDgyZWFmMzMwOTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lNWI3ZjZmOTZiNTY0OWYyOGRjZjMyYzhkYmU4MWIyMC5iaW5kUG9wdXAocG9wdXBfNTdlZjQ5OGQ4YWQ4NDYzMDk4ZjBmZWQxY2VjZWRiZWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjJkYzc2OTVkZGU2NDQzZjlmOTdiMTRkNjQyNTM0ZWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTksIDEyMF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yOGVkYmUyNDU5ODY0ZmMwYWJhNzUyYTFmNjA4NTkyOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OGE5NjZmYjc2ZjA0ZDVlOTcyZTRlMjkxMWM3OTM1MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzhhOTY2ZmI3NmYwNGQ1ZTk3MmU0ZTI5MTFjNzkzNTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoxMjA8YnI+bGF0Oi0xOTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjhlZGJlMjQ1OTg2NGZjMGFiYTc1MmExZjYwODU5Mjkuc2V0Q29udGVudChodG1sXzc4YTk2NmZiNzZmMDRkNWU5NzJlNGUyOTExYzc5MzUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjJkYzc2OTVkZGU2NDQzZjlmOTdiMTRkNjQyNTM0ZWYuYmluZFBvcHVwKHBvcHVwXzI4ZWRiZTI0NTk4NjRmYzBhYmE3NTJhMWY2MDg1OTI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2RmMjBiNjFiMDg3NDQ1ZDQ5ODk3MjM3YjhiYjUxYWFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbODQsIC01NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZjJkNmVmM2IyMzM0ZDM5YWYzYmYzNGRjNmViYjliNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lOWI3MjU4M2FjZGE0NjI0YmY2ZDM0YTMzYTNkMzkxOCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTliNzI1ODNhY2RhNDYyNGJmNmQzNGEzM2EzZDM5MTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotNTU8YnI+bGF0Ojg0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZjJkNmVmM2IyMzM0ZDM5YWYzYmYzNGRjNmViYjliNC5zZXRDb250ZW50KGh0bWxfZTliNzI1ODNhY2RhNDYyNGJmNmQzNGEzM2EzZDM5MTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kZjIwYjYxYjA4NzQ0NWQ0OTg5NzIzN2I4YmI1MWFhYS5iaW5kUG9wdXAocG9wdXBfZWYyZDZlZjNiMjMzNGQzOWFmM2JmMzRkYzZlYmI5YjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzFkOTY3MWY5ZDAzNDYwMmJlMzU0NDE4MDAxZTJjZDIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0NiwgMTA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I0NTU2ZWQ0ODczYzRiM2M5NWU0NThlMDg2ZGFjNjUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EwNjUxNjM2MTc0NTQxNGRhYzQ3YmMyNzQ5ZDkzYWJjID0gJCgnPGRpdiBpZD0iaHRtbF9hMDY1MTYzNjE3NDU0MTRkYWM0N2JjMjc0OWQ5M2FiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOjEwNjxicj5sYXQ6NDY8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I0NTU2ZWQ0ODczYzRiM2M5NWU0NThlMDg2ZGFjNjUzLnNldENvbnRlbnQoaHRtbF9hMDY1MTYzNjE3NDU0MTRkYWM0N2JjMjc0OWQ5M2FiYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzMxZDk2NzFmOWQwMzQ2MDJiZTM1NDQxODAwMWUyY2QyLmJpbmRQb3B1cChwb3B1cF9iNDU1NmVkNDg3M2M0YjNjOTVlNDU4ZTA4NmRhYzY1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81YzNlMTBmZGY0OGY0NDJjYjI4ODNkMTBiZjhlNmY0NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xOCwgLTE3NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MDk2MjgyYjUzMTA0ZDczOGNiZjExODU5MzYzMWQ2NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYjM4NzhkNzUwMmY0NGQ4YmE4NTFhNWVkNjhlZmNkMSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmIzODc4ZDc1MDJmNDRkOGJhODUxYTVlZDY4ZWZjZDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotMTc1PGJyPmxhdDotMTg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkwOTYyODJiNTMxMDRkNzM4Y2JmMTE4NTkzNjMxZDY3LnNldENvbnRlbnQoaHRtbF9iYjM4NzhkNzUwMmY0NGQ4YmE4NTFhNWVkNjhlZmNkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzVjM2UxMGZkZjQ4ZjQ0MmNiMjg4M2QxMGJmOGU2ZjQ0LmJpbmRQb3B1cChwb3B1cF85MDk2MjgyYjUzMTA0ZDczOGNiZjExODU5MzYzMWQ2Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lODFjNWE1YTUyZDI0NTE2YjRiOWEyZTQ2NzJiZWY3YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzY2LCAtMTUwXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU1MWEyNmM2NTVjOTQ2ZTRhZWFkODAxYjQzMGIzYzczID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc1ZDYyYTJlYjU4MTQ4MTM4MzdhNmVkNmFkNDM1ZjBmID0gJCgnPGRpdiBpZD0iaHRtbF83NWQ2MmEyZWI1ODE0ODEzODM3YTZlZDZhZDQzNWYwZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0xNTA8YnI+bGF0OjY2PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NTFhMjZjNjU1Yzk0NmU0YWVhZDgwMWI0MzBiM2M3My5zZXRDb250ZW50KGh0bWxfNzVkNjJhMmViNTgxNDgxMzgzN2E2ZWQ2YWQ0MzVmMGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lODFjNWE1YTUyZDI0NTE2YjRiOWEyZTQ2NzJiZWY3Yi5iaW5kUG9wdXAocG9wdXBfNTUxYTI2YzY1NWM5NDZlNGFlYWQ4MDFiNDMwYjNjNzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmE2ZDI2MDZmYmQ3NDY3MmExZWQ4Yzg1ZWVhNjM1NzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs4NSwgNDRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTJhMjdiNDIyOWQ1NDZhMDk0MjA2ZjNiNDg4YTI4N2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDBjNGY1MzgyODg5NDZjMGJkY2M4Zjc4YjQ3MThiNGIgPSAkKCc8ZGl2IGlkPSJodG1sXzQwYzRmNTM4Mjg4OTQ2YzBiZGNjOGY3OGI0NzE4YjRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246NDQ8YnI+bGF0Ojg1PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MmEyN2I0MjI5ZDU0NmEwOTQyMDZmM2I0ODhhMjg3Yi5zZXRDb250ZW50KGh0bWxfNDBjNGY1MzgyODg5NDZjMGJkY2M4Zjc4YjQ3MThiNGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iYTZkMjYwNmZiZDc0NjcyYTFlZDhjODVlZWE2MzU3Ny5iaW5kUG9wdXAocG9wdXBfNTJhMjdiNDIyOWQ1NDZhMDk0MjA2ZjNiNDg4YTI4N2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzk2OTUzNzJmZGIxNGE2Mjk2MjMzMDUxMTExMjYwY2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2NiwgLTQ4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI0ZGI4MWY4ZDI2YjRjZTU4MmVhNDBlY2QxMzdlMGNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY1YWU1ODFjMTgxYTQyMDhhNjQ2YzkzMzg0NzViNzczID0gJCgnPGRpdiBpZD0iaHRtbF82NWFlNTgxYzE4MWE0MjA4YTY0NmM5MzM4NDc1Yjc3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi00ODxicj5sYXQ6NjY8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI0ZGI4MWY4ZDI2YjRjZTU4MmVhNDBlY2QxMzdlMGNiLnNldENvbnRlbnQoaHRtbF82NWFlNTgxYzE4MWE0MjA4YTY0NmM5MzM4NDc1Yjc3Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzc5Njk1MzcyZmRiMTRhNjI5NjIzMzA1MTExMTI2MGNlLmJpbmRQb3B1cChwb3B1cF8yNGRiODFmOGQyNmI0Y2U1ODJlYTQwZWNkMTM3ZTBjYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kZDY0ZjA4MDhjOTI0NDkxYTBhNjI4MDhkMGQ5OGFkNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy02LCAxNzFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGJhYmJlMDcxMWVhNDUzM2I2NWE4NGIzZWU3NjhkMmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmQxZDM0NWZmYTY4NDRkMGEyYjRmYjkwNmJmMTJjYTggPSAkKCc8ZGl2IGlkPSJodG1sX2JkMWQzNDVmZmE2ODQ0ZDBhMmI0ZmI5MDZiZjEyY2E4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTcxPGJyPmxhdDotNjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGJhYmJlMDcxMWVhNDUzM2I2NWE4NGIzZWU3NjhkMmEuc2V0Q29udGVudChodG1sX2JkMWQzNDVmZmE2ODQ0ZDBhMmI0ZmI5MDZiZjEyY2E4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGQ2NGYwODA4YzkyNDQ5MWEwYTYyODA4ZDBkOThhZDQuYmluZFBvcHVwKHBvcHVwXzRiYWJiZTA3MTFlYTQ1MzNiNjVhODRiM2VlNzY4ZDJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzkxMzM1MGFlMTA5MTQwN2JhOGVlYjg3MDE1ZjRlNzhiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTgxLCAxN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OWUyZGE4N2RjYjE0YTU1OTlhZDM0ZGVjN2M3MjE0OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNzI3ODRhOGFlMDM0ZGNhYjcxOGYxMjc3ZWU4ZmNiZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzcyNzg0YThhZTAzNGRjYWI3MThmMTI3N2VlOGZjYmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoxNzxicj5sYXQ6LTgxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OWUyZGE4N2RjYjE0YTU1OTlhZDM0ZGVjN2M3MjE0OC5zZXRDb250ZW50KGh0bWxfYzcyNzg0YThhZTAzNGRjYWI3MThmMTI3N2VlOGZjYmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85MTMzNTBhZTEwOTE0MDdiYThlZWI4NzAxNWY0ZTc4Yi5iaW5kUG9wdXAocG9wdXBfODllMmRhODdkY2IxNGE1NTk5YWQzNGRlYzdjNzIxNDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjg0MWM2MmI5ZmM4NDhmYWFiZTFlZmY5OGUzN2JjN2QgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMzMsIDE1Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMDU1ZjBmZWZmZTA0Mzc2ODI5MTY5ODE2NzM5ZWU3NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMTQ2ZDc5NGZmNWQ0ZTYyOWVlOTJkM2QwZjgyOWUwYiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzE0NmQ3OTRmZjVkNGU2MjllZTkyZDNkMGY4MjllMGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjoxNTY8YnI+bGF0Oi0zMzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDA1NWYwZmVmZmUwNDM3NjgyOTE2OTgxNjczOWVlNzQuc2V0Q29udGVudChodG1sX2MxNDZkNzk0ZmY1ZDRlNjI5ZWU5MmQzZDBmODI5ZTBiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjg0MWM2MmI5ZmM4NDhmYWFiZTFlZmY5OGUzN2JjN2QuYmluZFBvcHVwKHBvcHVwX2QwNTVmMGZlZmZlMDQzNzY4MjkxNjk4MTY3MzllZTc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2U5ZjAxZTgzOWNhNzQ4NzFiYTk4NDlkODg2ZjdhOTU1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTgyLCAtNTRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTA1ZGMxMDhmOGVhNGE0N2JhYzNiMjRkMGNmZjhjNTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjkzNWIyYTY1ZmFiNGM5ZmI0NzgzNTg2ZTk3MjFmYmMgPSAkKCc8ZGl2IGlkPSJodG1sX2Y5MzViMmE2NWZhYjRjOWZiNDc4MzU4NmU5NzIxZmJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTU0PGJyPmxhdDotODI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwNWRjMTA4ZjhlYTRhNDdiYWMzYjI0ZDBjZmY4YzU4LnNldENvbnRlbnQoaHRtbF9mOTM1YjJhNjVmYWI0YzlmYjQ3ODM1ODZlOTcyMWZiYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U5ZjAxZTgzOWNhNzQ4NzFiYTk4NDlkODg2ZjdhOTU1LmJpbmRQb3B1cChwb3B1cF8xMDVkYzEwOGY4ZWE0YTQ3YmFjM2IyNGQwY2ZmOGM1OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kNWFhMDBiMTMzMDg0MjY0OWMzYjVjNzUxYzQ3MzEwNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ4LCAxMDVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjNjYzFkYmVmN2EzNDVhZmFjZDQyOWIxOWMxZDhkYWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTVmODBiN2UwMDllNDkyOGE2YmNjN2U4ZjI2ZjM2MTAgPSAkKCc8ZGl2IGlkPSJodG1sX2E1ZjgwYjdlMDA5ZTQ5MjhhNmJjYzdlOGYyNmYzNjEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTA1PGJyPmxhdDo0ODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjNjYzFkYmVmN2EzNDVhZmFjZDQyOWIxOWMxZDhkYWEuc2V0Q29udGVudChodG1sX2E1ZjgwYjdlMDA5ZTQ5MjhhNmJjYzdlOGYyNmYzNjEwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDVhYTAwYjEzMzA4NDI2NDljM2I1Yzc1MWM0NzMxMDQuYmluZFBvcHVwKHBvcHVwX2IzY2MxZGJlZjdhMzQ1YWZhY2Q0MjliMTljMWQ4ZGFhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQ3ZDhmZTFlZmE5NTQ1NzI4YTExYjAzMzQ0ZGQ3NzU5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTMyLCAtOTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTIxNjM4OWEwOTdhNDkyYWE5NDlmZDcwOGNlOGNiZWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDU3MjdhNmY1YWMwNDY2NTlhYzE4NjZjODkzMTMxYjYgPSAkKCc8ZGl2IGlkPSJodG1sXzA1NzI3YTZmNWFjMDQ2NjU5YWMxODY2Yzg5MzEzMWI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTkyPGJyPmxhdDotMzI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkyMTYzODlhMDk3YTQ5MmFhOTQ5ZmQ3MDhjZThjYmVkLnNldENvbnRlbnQoaHRtbF8wNTcyN2E2ZjVhYzA0NjY1OWFjMTg2NmM4OTMxMzFiNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ3ZDhmZTFlZmE5NTQ1NzI4YTExYjAzMzQ0ZGQ3NzU5LmJpbmRQb3B1cChwb3B1cF85MjE2Mzg5YTA5N2E0OTJhYTk0OWZkNzA4Y2U4Y2JlZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iM2RkZTYxOWMzNWQ0MzM2YTJiZjNiZTY2YWRkM2VkZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy04MywgLTIwXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzJmY2Q5ODY1Y2UwMTRjZDg4ZDNjYjJmYjBmNDY2Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI1ZDU5MjNiMzE1MDQwZjFiN2I1YzE2YWQ5Yjc4NzdjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJlOTk1MDhjYTlhZjQ3NjI4OGViZTIzMzg1MzljMDZlID0gJCgnPGRpdiBpZD0iaHRtbF8yZTk5NTA4Y2E5YWY0NzYyODhlYmUyMzM4NTM5YzA2ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG9uOi0yMDxicj5sYXQ6LTgzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNWQ1OTIzYjMxNTA0MGYxYjdiNWMxNmFkOWI3ODc3Yy5zZXRDb250ZW50KGh0bWxfMmU5OTUwOGNhOWFmNDc2Mjg4ZWJlMjMzODUzOWMwNmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iM2RkZTYxOWMzNWQ0MzM2YTJiZjNiZTY2YWRkM2VkZi5iaW5kUG9wdXAocG9wdXBfMjVkNTkyM2IzMTUwNDBmMWI3YjVjMTZhZDliNzg3N2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDcyMTUyOWJjYWUyNGYwN2ExM2U0MmE3ZGUxNjllMmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1LCAxNjZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzVlYjk1YmM2MTUxNGQxZDg0YTM0N2M1MjM3ZjYxMTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2EwOGZiZjhiZTQ0NDVkZTliYTE0NjQzNTRlYjhiMzQgPSAkKCc8ZGl2IGlkPSJodG1sX2NhMDhmYmY4YmU0NDQ1ZGU5YmExNDY0MzU0ZWI4YjM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246MTY2PGJyPmxhdDo1PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNWViOTViYzYxNTE0ZDFkODRhMzQ3YzUyMzdmNjExOC5zZXRDb250ZW50KGh0bWxfY2EwOGZiZjhiZTQ0NDVkZTliYTE0NjQzNTRlYjhiMzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wNzIxNTI5YmNhZTI0ZjA3YTEzZTQyYTdkZTE2OWUyZi5iaW5kUG9wdXAocG9wdXBfMzVlYjk1YmM2MTUxNGQxZDg0YTM0N2M1MjM3ZjYxMTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTYxZjA4MzRmZmZhNGZhMGIzYjdkODdkZTc3ODUwOTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNDMsIC0xNzhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTU3MjJmNjg0MDY1NDU4NDhjZmQ0MGViOWY2ODU2Y2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGIwNmJjMGMyM2U0NDk4N2I1ZTJmMWRhMDE3YTFmY2QgPSAkKCc8ZGl2IGlkPSJodG1sXzRiMDZiYzBjMjNlNDQ5ODdiNWUyZjFkYTAxN2ExZmNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246LTE3ODxicj5sYXQ6LTQzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNTcyMmY2ODQwNjU0NTg0OGNmZDQwZWI5ZjY4NTZjYS5zZXRDb250ZW50KGh0bWxfNGIwNmJjMGMyM2U0NDk4N2I1ZTJmMWRhMDE3YTFmY2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xNjFmMDgzNGZmZmE0ZmEwYjNiN2Q4N2RlNzc4NTA5MS5iaW5kUG9wdXAocG9wdXBfZTU3MjJmNjg0MDY1NDU4NDhjZmQ0MGViOWY2ODU2Y2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWFmOGFiYjY4ZTQ2NGM3MmFiOTA0NTYzYzA1MDBiZDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1NSwgNzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfMmZjZDk4NjVjZTAxNGNkODhkM2NiMmZiMGY0NjZjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2FlMWI1YzdkNmMzNDQ2MWI0Y2JmZWU3MDA3ZTVlZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmFjNTFmYjZlMmYyNDMyZmE5MjllMGU5MmJkZDk5MzYgPSAkKCc8ZGl2IGlkPSJodG1sXzJhYzUxZmI2ZTJmMjQzMmZhOTI5ZTBlOTJiZGQ5OTM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb246NzY8YnI+bGF0OjU1PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYWUxYjVjN2Q2YzM0NDYxYjRjYmZlZTcwMDdlNWVmZC5zZXRDb250ZW50KGh0bWxfMmFjNTFmYjZlMmYyNDMyZmE5MjllMGU5MmJkZDk5MzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85YWY4YWJiNjhlNDY0YzcyYWI5MDQ1NjNjMDUwMGJkNS5iaW5kUG9wdXAocG9wdXBfM2FlMWI1YzdkNmMzNDQ2MWI0Y2JmZWU3MDA3ZTVlZmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTQ0OTE1MmE5NGVmNDBjODg1ZTY1NmFlNGIwZDMzZWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjcsIC02M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl8yZmNkOTg2NWNlMDE0Y2Q4OGQzY2IyZmIwZjQ2NmM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYmY4MTY4OTFmOTI0NWNlYjRiMDFmNWRjZTk1NTE1MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82OTYxMTEzYTdkN2M0YmFhYTlhN2RiNmJkOWFmMWM4NiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjk2MTExM2E3ZDdjNGJhYWE5YTdkYjZiZDlhZjFjODYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvbjotNjM8YnI+bGF0Oi0yNzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWJmODE2ODkxZjkyNDVjZWI0YjAxZjVkY2U5NTUxNTMuc2V0Q29udGVudChodG1sXzY5NjExMTNhN2Q3YzRiYWFhOWE3ZGI2YmQ5YWYxYzg2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTQ0OTE1MmE5NGVmNDBjODg1ZTY1NmFlNGIwZDMzZWUuYmluZFBvcHVwKHBvcHVwX2ViZjgxNjg5MWY5MjQ1Y2ViNGIwMWY1ZGNlOTU1MTUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBsYXllcl9jb250cm9sXzcxOGI5NWFlYjlkZDQ4OWU5YjNlNTFjZWFiZTk3ZDA2ID0gewogICAgICAgICAgICAgICAgYmFzZV9sYXllcnMgOiB7ICJjYXJ0b2RicG9zaXRyb24iIDogdGlsZV9sYXllcl83ZGY4ZjkzNjBhNmM0NDU2OWQxOTFiNzk4YzhhOTA2ZSwgfSwKICAgICAgICAgICAgICAgIG92ZXJsYXlzIDogeyAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgTC5jb250cm9sLmxheWVycygKICAgICAgICAgICAgICAgIGxheWVyX2NvbnRyb2xfNzE4Yjk1YWViOWRkNDg5ZTliM2U1MWNlYWJlOTdkMDYuYmFzZV9sYXllcnMsCiAgICAgICAgICAgICAgICBsYXllcl9jb250cm9sXzcxOGI5NWFlYjlkZDQ4OWU5YjNlNTFjZWFiZTk3ZDA2Lm92ZXJsYXlzLAogICAgICAgICAgICAgICAge3Bvc2l0aW9uOiAndG9wcmlnaHQnLAogICAgICAgICAgICAgICAgIGNvbGxhcHNlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICBhdXRvWkluZGV4OiB0cnVlCiAgICAgICAgICAgICAgICB9KS5hZGRUbyhtYXBfYWQ0MmRiYzdiNWRlNDc3MWFmNjhlYWIwOGNiZDdmOWMpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7fb318fdf0b8>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.save(os.path.join('results', '1000_MarkerCluster2.html'))\n",
    "\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`FastMarkerCluster` is not as flexible as MarkerCluster but, like the name suggests, it is faster."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from folium.plugins import FastMarkerCluster"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 72 ms, sys: 0 ns, total: 72 ms\n",
      "Wall time: 70.9 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "\n",
    "\n",
    "m = folium.Map(\n",
    "    location=[np.mean(lats), np.mean(lons)],\n",
    "    tiles='Cartodb Positron',\n",
    "    zoom_start=1\n",
    ")\n",
    "\n",
    "FastMarkerCluster(data=list(zip(lats, lons))).add_to(m)\n",
    "\n",
    "folium.LayerControl().add_to(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2dpdC5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIiAvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNWZiMjFjNTU4YWE3NGMyNTk0ZTMyODBkNzBmMmUyNjAgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4xLjAvTWFya2VyQ2x1c3Rlci5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9NYXJrZXJDbHVzdGVyLkRlZmF1bHQuY3NzIiAvPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzVmYjIxYzU1OGFhNzRjMjU5NGUzMjgwZDcwZjJlMjYwIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF81ZmIyMWM1NThhYTc0YzI1OTRlMzI4MGQ3MGYyZTI2MCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF81ZmIyMWM1NThhYTc0YzI1OTRlMzI4MGQ3MGYyZTI2MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbLTIuMTIsLTguNTVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfMmEwMDJkMmMxYTc3NDk0ODg1NjhkZTgwNmJjNWVkNjYgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL2NhcnRvZGItYmFzZW1hcHMte3N9Lmdsb2JhbC5zc2wuZmFzdGx5Lm5ldC9saWdodF9hbGwve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZmIyMWM1NThhYTc0YzI1OTRlMzI4MGQ3MGYyZTI2MCk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNhbGxiYWNrOwpjYWxsYmFjayA9IGZ1bmN0aW9uIChyb3cpIHsKCXZhciBpY29uLCBtYXJrZXI7CgkvLyBSZXR1cm5zIGEgTC5tYXJrZXIgb2JqZWN0CglpY29uID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKCk7CgltYXJrZXIgPSBMLm1hcmtlcihuZXcgTC5MYXRMbmcocm93WzBdLCByb3dbMV0pKTsKCW1hcmtlci5zZXRJY29uKGljb24pOwoJcmV0dXJuIG1hcmtlcjsKfTsKCiAgICAgICAgICAgIChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBbWy0xNywgLTg0XSwgWzEyLCAtMTczXSwgWy00OSwgMzFdLCBbLTM5LCAtMzldLCBbLTg0LCA2MV0sIFstNzUsIC0yM10sIFstMzEsIC0xMzFdLCBbLTksIC0xMDFdLCBbLTM4LCAxNjRdLCBbMzQsIDE2Nl0sIFsyMiwgMTM5XSwgWy02MSwgLTc5XSwgWzM0LCAtMTEzXSwgWy0yLCAtMTI5XSwgWy00OCwgLTExMV0sIFstOCwgMTIwXSwgWzIxLCA5Nl0sIFstMjAsIC0xMjldLCBbLTI0LCAtMTExXSwgWzMwLCAtMTQ3XSwgWy0yMCwgNzZdLCBbNDEsIDEyOV0sIFstMTAsIDE0NV0sIFstNDksIC03OV0sIFszNywgLTcwXSwgWzY2LCAxNDhdLCBbLTg4LCAtMTA0XSwgWy01MSwgLTddLCBbNjIsIDExOF0sIFstMzcsIDExN10sIFstNjgsIC04MF0sIFs2OSwgLTEyNl0sIFs0LCAyN10sIFs4OCwgNTRdLCBbLTgsIDE3MF0sIFsxOCwgMTc4XSwgWzUzLCAtMTc0XSwgWzE5LCAxNzhdLCBbLTQ5LCAtMThdLCBbLTg5LCAtOTddLCBbLTgxLCAtOTNdLCBbMzcsIDI0XSwgWzIwLCAtNzhdLCBbNTksIC0zOV0sIFstNjEsIDMyXSwgWzU5LCAtMTM5XSwgWzY1LCA5NF0sIFszMywgLTE0M10sIFstNDksIDU3XSwgWzYsIDEyM10sIFstNjQsIC01Nl0sIFs1NCwgNTJdLCBbLTI3LCAxMTBdLCBbLTgyLCAtMTQ3XSwgWy00OSwgLTExM10sIFstMjAsIC0xNDVdLCBbNTksIDU2XSwgWzU1LCAxMDZdLCBbLTg1LCAtNjZdLCBbLTg2LCAtMTYyXSwgWy00LCAyN10sIFs1MCwgLTEwXSwgWy03NSwgLTIxXSwgWy04MywgLTE1MF0sIFs1OCwgLTU5XSwgWzI2LCA2OV0sIFs4NCwgLTI3XSwgWzc3LCAtMTI1XSwgWy0xOSwgLTY5XSwgWzQ2LCAxNDddLCBbLTc0LCA4OF0sIFstMjMsIC0xNV0sIFs0MSwgLTg1XSwgWy0zNiwgLTEzOV0sIFs4OSwgMTczXSwgWzU3LCAtOV0sIFstMzcsIC0xNDJdLCBbNDUsIDE0OF0sIFsyNSwgLTY2XSwgWzUwLCAxNDhdLCBbLTQ3LCAtMTczXSwgWzI4LCAtMTU2XSwgWy0xOSwgMTIwXSwgWzg0LCAtNTVdLCBbNDYsIDEwNl0sIFstMTgsIC0xNzVdLCBbNjYsIC0xNTBdLCBbODUsIDQ0XSwgWzY2LCAtNDhdLCBbLTYsIDE3MV0sIFstODEsIDE3XSwgWy0zMywgMTU2XSwgWy04MiwgLTU0XSwgWzQ4LCAxMDVdLCBbLTMyLCAtOTJdLCBbLTgzLCAtMjBdLCBbNSwgMTY2XSwgWy00MywgLTE3OF0sIFs1NSwgNzZdLCBbLTI3LCAtNjNdXTsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSBtYXBfNWZiMjFjNTU4YWE3NGMyNTk0ZTMyODBkNzBmMmUyNjA7CiAgICAgICAgICAgICAgICB2YXIgY2x1c3RlciA9IEwubWFya2VyQ2x1c3Rlckdyb3VwKCk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IGRhdGFbaV07CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcmtlciA9IGNhbGxiYWNrKHJvdyk7CiAgICAgICAgICAgICAgICAgICAgbWFya2VyLmFkZFRvKGNsdXN0ZXIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNsdXN0ZXIuYWRkVG8obWFwKTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGxheWVyX2NvbnRyb2xfYjk4NmNiNzllNGQyNGE0OGJlZjFjYzMwZDYyMmM0NjkgPSB7CiAgICAgICAgICAgICAgICBiYXNlX2xheWVycyA6IHsgImNhcnRvZGJwb3NpdHJvbiIgOiB0aWxlX2xheWVyXzJhMDAyZDJjMWE3NzQ5NDg4NTY4ZGU4MDZiYzVlZDY2LCB9LAogICAgICAgICAgICAgICAgb3ZlcmxheXMgOiB7ICJtYWNyb19lbGVtZW50Xzc3YzlmODNkZGQ1NDQ3YmFiOTI5YmU1ZjViMjAzODhmIiA6IGZhc3RfbWFya2VyX2NsdXN0ZXJfNzdjOWY4M2RkZDU0NDdiYWI5MjliZTVmNWIyMDM4OGYsIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIEwuY29udHJvbC5sYXllcnMoCiAgICAgICAgICAgICAgICBsYXllcl9jb250cm9sX2I5ODZjYjc5ZTRkMjRhNDhiZWYxY2MzMGQ2MjJjNDY5LmJhc2VfbGF5ZXJzLAogICAgICAgICAgICAgICAgbGF5ZXJfY29udHJvbF9iOTg2Y2I3OWU0ZDI0YTQ4YmVmMWNjMzBkNjIyYzQ2OS5vdmVybGF5cywKICAgICAgICAgICAgICAgIHtwb3NpdGlvbjogJ3RvcHJpZ2h0JywKICAgICAgICAgICAgICAgICBjb2xsYXBzZWQ6IHRydWUsCiAgICAgICAgICAgICAgICAgYXV0b1pJbmRleDogdHJ1ZQogICAgICAgICAgICAgICAgfSkuYWRkVG8obWFwXzVmYjIxYzU1OGFhNzRjMjU5NGUzMjgwZDcwZjJlMjYwKTsKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7fb318ceaba8>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.save(os.path.join('results', '1000_MarkerCluster3.html'))\n",
    "\n",
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2dpdC5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIiAvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMjc1ZDk0OGNmZDg4NDVjNTk5MmZkZTk1MjY3NjRiYjMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4xLjAvTWFya2VyQ2x1c3Rlci5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9NYXJrZXJDbHVzdGVyLkRlZmF1bHQuY3NzIiAvPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzI3NWQ5NDhjZmQ4ODQ1YzU5OTJmZGU5NTI2NzY0YmIzIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8yNzVkOTQ4Y2ZkODg0NWM1OTkyZmRlOTUyNjc2NGJiMyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8yNzVkOTQ4Y2ZkODg0NWM1OTkyZmRlOTUyNjc2NGJiMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbLTIuMTIsLTguNTVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfYzdiODRiODU3NThiNDg2MmJlMWY0MDI0ZDRjZGIwMTQgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL2NhcnRvZGItYmFzZW1hcHMte3N9Lmdsb2JhbC5zc2wuZmFzdGx5Lm5ldC9saWdodF9hbGwve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yNzVkOTQ4Y2ZkODg0NWM1OTkyZmRlOTUyNjc2NGJiMyk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gKHJvdykgewogICAgdmFyIGljb24sIG1hcmtlcjsKICAgIGljb24gPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgIGljb246ICJtYXAtbWFya2VyIiwgbWFya2VyQ29sb3I6ICJyZWQifSk7CiAgICBtYXJrZXIgPSBMLm1hcmtlcihuZXcgTC5MYXRMbmcocm93WzBdLCByb3dbMV0pKTsKICAgIG1hcmtlci5zZXRJY29uKGljb24pOwogICAgcmV0dXJuIG1hcmtlcjsKfTsKOwoKICAgICAgICAgICAgKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IFtbLTE3LCAtODRdLCBbMTIsIC0xNzNdLCBbLTQ5LCAzMV0sIFstMzksIC0zOV0sIFstODQsIDYxXSwgWy03NSwgLTIzXSwgWy0zMSwgLTEzMV0sIFstOSwgLTEwMV0sIFstMzgsIDE2NF0sIFszNCwgMTY2XSwgWzIyLCAxMzldLCBbLTYxLCAtNzldLCBbMzQsIC0xMTNdLCBbLTIsIC0xMjldLCBbLTQ4LCAtMTExXSwgWy04LCAxMjBdLCBbMjEsIDk2XSwgWy0yMCwgLTEyOV0sIFstMjQsIC0xMTFdLCBbMzAsIC0xNDddLCBbLTIwLCA3Nl0sIFs0MSwgMTI5XSwgWy0xMCwgMTQ1XSwgWy00OSwgLTc5XSwgWzM3LCAtNzBdLCBbNjYsIDE0OF0sIFstODgsIC0xMDRdLCBbLTUxLCAtN10sIFs2MiwgMTE4XSwgWy0zNywgMTE3XSwgWy02OCwgLTgwXSwgWzY5LCAtMTI2XSwgWzQsIDI3XSwgWzg4LCA1NF0sIFstOCwgMTcwXSwgWzE4LCAxNzhdLCBbNTMsIC0xNzRdLCBbMTksIDE3OF0sIFstNDksIC0xOF0sIFstODksIC05N10sIFstODEsIC05M10sIFszNywgMjRdLCBbMjAsIC03OF0sIFs1OSwgLTM5XSwgWy02MSwgMzJdLCBbNTksIC0xMzldLCBbNjUsIDk0XSwgWzMzLCAtMTQzXSwgWy00OSwgNTddLCBbNiwgMTIzXSwgWy02NCwgLTU2XSwgWzU0LCA1Ml0sIFstMjcsIDExMF0sIFstODIsIC0xNDddLCBbLTQ5LCAtMTEzXSwgWy0yMCwgLTE0NV0sIFs1OSwgNTZdLCBbNTUsIDEwNl0sIFstODUsIC02Nl0sIFstODYsIC0xNjJdLCBbLTQsIDI3XSwgWzUwLCAtMTBdLCBbLTc1LCAtMjFdLCBbLTgzLCAtMTUwXSwgWzU4LCAtNTldLCBbMjYsIDY5XSwgWzg0LCAtMjddLCBbNzcsIC0xMjVdLCBbLTE5LCAtNjldLCBbNDYsIDE0N10sIFstNzQsIDg4XSwgWy0yMywgLTE1XSwgWzQxLCAtODVdLCBbLTM2LCAtMTM5XSwgWzg5LCAxNzNdLCBbNTcsIC05XSwgWy0zNywgLTE0Ml0sIFs0NSwgMTQ4XSwgWzI1LCAtNjZdLCBbNTAsIDE0OF0sIFstNDcsIC0xNzNdLCBbMjgsIC0xNTZdLCBbLTE5LCAxMjBdLCBbODQsIC01NV0sIFs0NiwgMTA2XSwgWy0xOCwgLTE3NV0sIFs2NiwgLTE1MF0sIFs4NSwgNDRdLCBbNjYsIC00OF0sIFstNiwgMTcxXSwgWy04MSwgMTddLCBbLTMzLCAxNTZdLCBbLTgyLCAtNTRdLCBbNDgsIDEwNV0sIFstMzIsIC05Ml0sIFstODMsIC0yMF0sIFs1LCAxNjZdLCBbLTQzLCAtMTc4XSwgWzU1LCA3Nl0sIFstMjcsIC02M11dOwogICAgICAgICAgICAgICAgdmFyIG1hcCA9IG1hcF8yNzVkOTQ4Y2ZkODg0NWM1OTkyZmRlOTUyNjc2NGJiMzsKICAgICAgICAgICAgICAgIHZhciBjbHVzdGVyID0gTC5tYXJrZXJDbHVzdGVyR3JvdXAoKTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcm93ID0gZGF0YVtpXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbWFya2VyID0gY2FsbGJhY2socm93KTsKICAgICAgICAgICAgICAgICAgICBtYXJrZXIuYWRkVG8oY2x1c3Rlcik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2x1c3Rlci5hZGRUbyhtYXApOwogICAgICAgICAgICB9KSgpOwogICAgICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7fb318d16630>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "callback = \"\"\"\\\n",
    "function (row) {\n",
    "    var icon, marker;\n",
    "    icon = L.AwesomeMarkers.icon({\n",
    "        icon: \"map-marker\", markerColor: \"red\"});\n",
    "    marker = L.marker(new L.LatLng(row[0], row[1]));\n",
    "    marker.setIcon(icon);\n",
    "    return marker;\n",
    "};\n",
    "\"\"\"\n",
    "m = folium.Map(\n",
    "    location=[np.mean(lats), np.mean(lons)],\n",
    "    tiles='Cartodb Positron',\n",
    "    zoom_start=1\n",
    ")\n",
    "\n",
    "FastMarkerCluster(\n",
    "    data=list(zip(lats, lons)),\n",
    "    callback=callback\n",
    ").add_to(m)\n",
    "\n",
    "\n",
    "m.save(os.path.join('results', '1000_MarkerCluster4.html'))\n",
    "\n",
    "m"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
